假设有棵树,长下面这个样子,它的前序遍历,中序遍历,后续遍历都很容易知道。
PreOrder: GDAFEMHZ
InOrder: ADEFGHMZ
PostOrder: AEFDHZMG
现在,假设仅仅知道前序和中序遍历,如何求后序遍历呢?比如,已知一棵树的前序遍历是”GDAFEMHZ”,而中序遍历是”ADEFGHMZ”应该如何求后续遍历?
具体代码:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int n,tot=0;
char a[2005],b[2005];
void f(int y,int z)
{
if(y>z) { tot--;return ;}
if(y==z&&b[y]!='.')
{
cout<<b[z];
b[z]='.';
return ;
}
for (int i=0;i<=n;i++)
if(a[tot]==b[i])
{
tot+=1;f(y,i-1);
tot+=1;f(i+1,z);
cout<<b[i];
break;
}
return ;
}
int main()
{
freopen("tree.in","r",stdin);
freopen("tree.out","w",stdout);
gets(a);gets(b);
n=strlen(a)-1;
tot=0;
f(0,n);
}