这个要是不用写代码的话,大家应该也都会做!
【问题描述】
二叉树是一种非常重要的数据结构,非常多其他数据结构都是基于二叉树的基础演变而来的。对于二叉树,深度遍历有前序、中序以及后序三种遍历方法。
三种基本的遍历思想为:
前序遍历:根结点 —> 左子树 —> 右子树
中序遍历:左子树—> 根结点 —> 右子树
后序遍历:左子树 —> 右子树 —> 根结点
比如,求以下二叉树的各种遍历
前序遍历: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
abcddcba
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;
}
}