题目描述
输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列。
输入
输入数据共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串,表示树的中序遍历。树的结点一律用小写字母表示。
输出
输出仅一行,表示树的后序遍历序列
样例输入
abdec dbeac
样例输出
debca
代码分析如下:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int N=1000+100;
int lsa,num=1;
char sa[N],sb[N];//sa储存先序遍历,sb储存中序遍历;
struct node
{
int left,right;
}tree[N];//用来储存二叉树。
void dfs(int,int,int);//通过先序遍历和中序遍历建树。
void ldfs(int);//输出后序遍历。
int main()
{
cin>>sa+1>>sb+1;
lsa=strlen(sa+1);
dfs(1,lsa,0);
ldfs(sa[1]);
}
void dfs(int bg,int ed,int fa)//bg与ed形成查找范围,fa为双亲(parent)
{
if(num==lsa+1)
return;
for(int i=bg;i<=ed;i++)
if(sa[num]==sb[i])
{
num++;
if(!tree[fa].left)
tree[fa].left=sb[i];
else
tree[fa].right=sb[i];
dfs(bg,i-1,sb[i]);//找左树
dfs(i+1,ed,sb[i]);//找右树
}
}
void ldfs(int ch)//后序遍历
{
if(ch)//ch为结点
{
ldfs(tree[ch].left);//先访问左子数
ldfs(tree[ch].right);//再访问右子数
cout<<char(ch);
}
}