二叉树遍历,从前序、中序到后序

这个要是不用写代码的话,大家应该也都会做!

【问题描述】

二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树,深度遍历有前序、中序以及后序三种遍历方法。

三种基本的遍历思想为:

前序遍历:根结点 —> 左子树 —> 右子树

中序遍历:左子树—> 根结点 —> 右子树

后序遍历:左子树 —> 右子树 —> 根结点

比如,求以下二叉树的各种遍历
在这里插入图片描述
前序遍历:1 2 4 5 7 8 3 6

中序遍历:4 2 7 5 8 1 3 6

后序遍历:4 7 8 5 2 6 3 1

需要你编写程序解决的问题是:已知一个二叉树的前序遍历和中序遍历的结果,给出该二叉树的后序遍历的结果。

【输入形式】

有多组测试数据,每组测试数据三行,每组测试数据第一行只有一个正整数n,表示二叉树节点的数目,n=0意味着输入结束并且不需要处理。

每组测试数据第二行是二叉树的前序遍历的结果,是一个长度为n的字符串,每个节点由一个字符表示,字符是大小写英文字母及10个数字,不同的节点用不同的字符表示,也即无论前序遍历和中序遍历的字符串中没有重复的字符。

每组测试数据第二行是二叉树的中序遍历的结果,也是一个长度为n的字符串。

40%的测试数据1 ≤ n≤ 10;

30%的测试数据1 ≤ n≤ 20;

20%的测试数据1 ≤ n≤ 40;

10%的测试数据1 ≤ n≤ 62;

【输出形式】

对于每组测试数据,输出一行,是一个长度为n的字符串,表示二叉树后序遍历的结果。

【样例输入】

8
12457836
42758136
4
abcd
abcd
4
abcd

dcba
0

【样例输出】

47852631
dcba
dcba


解题思路:

后序遍历是什么,就是先左子树,再右子树,最后根结点呗,那就好了呀。
遍历都得用递归,那我就正常的用递归做就好了呀。

比如:

8
12457836
42758136
先看先序遍历,先找到根节点1,对吧,然后呢,当然再看中序,1左边的为左子树,右边的为右子树,那不就好了吗


那代码不是手到擒来:
递归(中序遍历得出的左子树)
递归(中序遍历得出的右子树)
输出先序遍历得到的根节点
(只要输出根节点就行了,因为递归到最后全都可以看做根节点)


那就直接上代码:

#include <iostream>
using namespace std;
string a,b;//用于记录前序遍历和中序遍历
void build(int l1,int r1,int l2,int r2)//构建后序遍历
{
    for(int i=l2;i<=r2;i++)
    {
        if(b[i]==a[l1])
        {
            build(l1+1,l1+i-l2,l2,i-1);//递归左子树
            build(l1+i-l2+1,r1,i+1,r2);//递归右子树
            cout<<a[l1];//输出根节点
            return;
        }
    }
}
int main()
{
    int n;
    while(cin>>n&&n!=0)
    {
        cin>>a;//前序遍历
        cin>>b;//中序遍历
        build(0,a.length()-1,0,b.length()-1);
        cout<<endl;
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无意识程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值