根据两种遍历顺序确定树结构(build-tree)
题目描述
输入
第1行:二叉树的前序遍历顺序第2行:中序遍历顺序
输出
二叉树的后序遍历顺序
样例输入
ABCDEFGH
CBEDAGHF
样例输出
CEDBHGFA
初次看到这道题,表示我一脸懵逼——这太难了吧!在纸上模拟都很困难!不过,仔细一想也没什么,先序遍历的第一个字母A就是整棵树的根节点,在中序遍历中把树分成两半,左边是左子树,右边是右子树,然后字母B又是左子树的根节点,字母C又是左子树的左子树的根节点……这样递归分成两半(左子树和右子树)即可,但是由于是字母,必须用结构体数组保存坐标,还需要放在合适的位置,需要细细的思考,那么以下就是AC代码啦:
#include<cstdio>
#include<cstring>
using namespace std;
struct Tree
{
int f;
int l,r;
}t[505];
char x[505];
char z[505];
int len,k;
int find(int le,int ri)
{
int u=k;
if(le>ri)
{
return 0;
}
for(int i=le;i<=ri;i++)
{
if(z[i]==x[u])
{
k++;
int q=find(le,i-1),h=find(i+1,ri);
t[u].l=q;
t[u].r=h;
t[q].f=u;
t[h].f=u;
}
}
return u;
}
void back(int y)
{
if(t[y].l)
{
back(t[y].l);
}
if(t[y].r)
{
back(t[y].r);
}
printf("%c",x[y]);
}
int main()
{
//freopen("build-tree.in","r",stdin);
//freopen("build-tree.out","w",stdout);
scanf("%s %s",x,z);
len=strlen(x);
find(0,len-1);
back(0);
}