首页 > 其他分享 >已知后序和中序输出前序(二叉树)

已知后序和中序输出前序(二叉树)

时间:2022-10-25 19:11:08浏览次数:54  
标签:index 后序 int 中序 二叉树 post root 前序

已知后序和中序输出前序(二叉树)

给出二叉树的后序遍历和中序遍历,要求输出二叉树的前序遍历:

后序:2 3 1 5 7 6 4

中序:1 2 3 4 5 6 7

分析:由后序遍历的特性可知,后序的最后一个总是根结点,令root_index_in在中序中找到该根结点,则root_index_in把中序分为两部分,左边是左子树右边是右子树。因为是输出前序(根左右),所以先打印出当前根结点,然后打印左子树,再打印右子树。左子树在后序中的根结点为root_index_post - (in_end - root_index_in) - 1,即为当前根结点 - (右子树的结点树) - 1;左子树在中序中的起始索引为in_start,末尾索引为root_index_in - 1。右子树的根节点为当前根节点的前一个结点,即为root_index_post - 1;右子树的起始索引为root_index_in + 1,末尾索引为in_end

以下代码为输出层序遍历,将level.emplace(tree_index, root)改为cout << root " " 即可输出前序遍历

#include <iostream>
#include <map>
using namespace std;
int post_order[30] = {0};
int in_order[30] = {0};
map<int, int> level;
int n;

inline void dfs(int root_index_post, int in_start, int in_end, int tree_index)
{
    if (in_start > in_end)
        return;
    int root = post_order[root_index_post];
    level.emplace(tree_index, root);
    int root_index_in = 0;
    while (in_order[root_index_in] != root)
        root_index_in++;
    dfs(root_index_post - in_end + root_index_in - 1, in_start, root_index_in - 1, 2 * tree_index);
    dfs(root_index_post - 1, root_index_in + 1, in_end, 2 * tree_index + 1);
    return;
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> post_order[i];
    for (int i = 0; i < n; i++)
        cin >> in_order[i];
    dfs(n - 1, 0, n - 1, 1);
    int count = 0;
    for (auto it = level.begin(); it != level.end(); it++)
    {
        count++;
        if (count != n)
            cout << it->second << " ";
        else
            cout << it->second << endl;
    }
    return 0;
}

标签:index,后序,int,中序,二叉树,post,root,前序
From: https://www.cnblogs.com/TNTksals/p/16825973.html

相关文章

  • python实现二叉树并且遍历
    python实现二叉树并且遍历2.1二叉树的遍历2.1.1前序遍历(根左右)二叉树的前序遍历的步骤如下:访问树的根节点---->访问当前节点的左子树---->若当前节点无左子树,访......
  • 关于存储二叉树
    !前置芝士:二叉树的性质\(1.\)二叉树中,第\(i\)层最多有\(2i-1\)个结点。\(2.\)如果二叉树的深度为\(K\),那么此二叉树最多有\(2K-1\)个结点。二叉树中,终端结点数(叶子结......
  • BZOJ 2111([ZJOI2010]Perm 排列计数-乘法逆元+完全二叉树模型+数列分数表示法)
    2111:[ZJOI2010]Perm排列计数TimeLimit: 10Sec  MemoryLimit: 259MBSubmit: 478  Solved: 283[​​Submit​​][​​Status​​][​​Discuss​​]......
  • 7-1 二叉树遍历应用
    读入用户输入的一串字符串,将字符串按照先序遍历建立一个二叉树。其中“#”表示的是空格,代表空树。再对建立好的二叉树进行中序遍历,输出遍历结果。#include<iostream>#i......
  • 二叉树的四种遍历顺序
    题目102二叉树的层序遍历思路用队列实现层序遍历。代码#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,righ......
  • 完全二叉树的节点数
    222.完全二叉树的节点个数中文语境和英文语境似乎有点区别,我们说的完全二叉树对应英文CompleteBinaryTree,没有问题。但是我们说的满二叉树对应英文PerfectBinaryTr......
  • 力扣 114. 二叉树展开为链表-原地算法(O(1) 额外空间)详解
    114.二叉树展开为链表给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而......
  • 【二叉树】两棵二叉搜索树中的所有元素
    0x00题目给你​​root1​​​和​​root2​​​这两棵二叉搜索树请你返回一个列表其中包含​​​两棵树​​​中的所有整数并按​​升序​​排序0x01思路二叉搜......
  • 【二叉树】删点成林
    0x00题目给出二叉树的根节点​​root​​​树上每个节点都有一个不同的值如果节点值在​​to_delete​​中出现我们就把该节点从树上​​删去​​最后得到一个森林(......
  • 【二叉树】二叉树中的最长交错路径
    0x00题目给你一棵以​​root​​为根的二叉树,二叉树中的交错路径定义如下:选择二叉树中​​任意​​​节点和一个方向(​​左​​​或者​​右​​​)如果前进方向为​​......