由前序遍历和中序遍历求后序遍历
Sample Input
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
Sample Output
7 4 2 8 9 5 6 3 1
#include<cstdio>
int qian[1005],zhong[1005];
void ecs(int a,int b,int n,int flag) //在前序是第几个,在中序是第几个,几个元素,是否第一棵树
{
if(n==1) //叶节点
{
printf("%d ",qian[a]);
return;
}
else if(n<=0) return; //如果不存在左子树或右子树就返回上一层
int i;
for(i=0;qian[a]!=zhong[b+i];i++); //遍历左子树的数目
ecs(a+1,b,i,0); //左子树
ecs(a+1+i,b+i+1,n-i-1,0); //右子树
if(flag==1)//最原始的跟节点
printf("%d",qian[a]);
else//一般的根节点
printf("%d ",qian[a]);
}
int main()
{
int n,i;
while(scanf("%d",&n)==1)
{
for(i=1;i<=n;i++) scanf("%d",&qian[i]);
for(i=1;i<=n;i++) scanf("%d",&zhong[i]);
ecs(1,1,n,1);
printf("\n");
}
return 0;
}