题目描述:
二叉树的前序、中序、后序遍历的定义:
前序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树;
中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树;
后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。
输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
输入格式:
共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。
字符串的长度均小于等于26。
输出格式:
仅一行,表示树的后序遍历序列。
样例输入:
abdec dbeac
样例输出:
debcad
题解:
输入二叉树的前序遍历、中序遍历,求后序遍历
题目关键在于如何建立这棵二叉树。采取递归的方法建立二叉树。首先取前序遍历的首元素当作二叉树的跟,当前元素为根。把前序遍历中的当前元素当作中序遍历的分割点,中序便利分割点前面的元素一定在当前元素的左子树,分割点后面元素一定在当前元素的右子树。然后加入下一个顶点,再把它当作分割点。如此递归的进行,直到二叉树建立完成。
代码如下:
#include<bits/stdc++.h>
using namespace std;
string middle,front;
int s=0;
void fun(int left,int right){
if(left>right){//已经遍历完毕
return;
}
for(int i=left;i<=right;i++){
if(middle[i]==front[s]){
s++;//*下面是根据后序遍历的定义输出(左右根)
fun(left,i-1);//构造i的左子数
fun(i+1,right);//构造i的右儿数
printf("%c",middle[i]);
return;
}
}
}
int main(){
cin>>front>>middle;
fun(0,middle.size()/*求出长度*/-1);
return 0;
}