已知二叉树的后序和中序遍历求前序遍历

假设二叉树上各结点的权值互不相同且都为正整数。

给定二叉树的后序遍历和中序遍历,请你输出二叉树的前序遍历序列。

输入格式:

第一行包含整数 N,表示二叉树结点总数。

第二行给出二叉树的后序遍历序列。

第三行给出二叉树的中序遍历序列。

输出格式

输出二叉树的前序遍历

数据范围

1≤N≤50000,
二叉树结点权值范围 [1,1e9]。

样例输入:

7
1 2 3 4 5 6 7
2 1 4 3 7 5 6

样例输出:

7 4 2 1 3 6 5

题解:

已知,树的后序遍历最后一个数就是该树(子树)的 root 节点,我们每次只需要取后序遍历的最后一个节点就行~~

代码当中的build函数传递的分别是 一棵树(子树)后序遍历的左右闭区间 和 中序遍历的左右闭区间
这题比较难确定的是build函数中的第二个参数,也就是后序遍历的右区间
这里我们令其为 x ,下面我给出一个图来表示 x 的计算过程

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
unordered_map<int,int> l, r, c;
int build(int al, int ar, int bl, int br) // a 是后序, b 是中序
{
    int root = a[ar];   // 后序遍历的最后一个数 是该树的根节点, 子树也是

    int k = c[root];               // 👇 这个是 x
    if (k > bl) l[root] = build(al, k - bl + al - 1, bl, k - 1);
    if (k < br) r[root] = build(k - bl + al, ar - 1, k + 1, br);
                             // 👆这个是 x + 1
    return root;
}
int n;
void print(int root)
{
    cout << root << endl;
    if (l[root] != 0) print(l[root]);
    if (r[root] != 0) print(r[root]);
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++) cin >> a[i];
    for (int i = 0; i < n; i ++)
    {
        cin >> b[i]; c[b[i]] = i;
        // c 用来存储 节点 x, 即b[i] 在中序遍历中的下标
    }
    int root = build(0, n -1, 0, n - 1);

    print(root);
    return 0;
}

觉得写的不错的话,点个赞吧

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值