题意:已知先序和中序,求后序遍历结果
要注意输出时格式问题(两数之间有一个空格,最后一个数后无空格)
具体思想请参考上一篇博客
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu
{
int c;
struct stu *l,*r;
}Tree;
int j;
void creat(Tree **T,int *z,int m1,int n1,int *x,int m2,int n2)
{
int i;
*T=NULL;
if(m1==n1){
*T=(Tree *)malloc(sizeof(Tree));
(*T)->c=z[m1];
(*T)->l=(*T)->r=NULL;
}
else{
for(i=m1;i<=n1;i++)
if(z[i]==x[m2])
break;
*T=(Tree *)malloc(sizeof(Tree));
(*T)->c=x[m2];
if(i-1>=m1&&i+1<=n1){
creat(&(*T)->l,z,m1,i-1,x,m2+1,m2+i-m1);
creat(&(*T)->r,z,i+1,n1,x,m2+i-m1+1,n2);
}
else if(i-1<m1&&i+1<=n1){
creat(&(*T)->r,z,i+1,n1,x,m2+i-m1+1,n2);
(*T)->l=NULL;
}
else if(i-1>=m1&&i+1>n1){
creat(&(*T)->l,z,m1,i-1,x,m2+1,m2+i-m1);
(*T)->r=NULL;
}
}
}
void printh(Tree *T,int n)
{
if(T!=NULL){
printh(T->l,n);
printh(T->r,n);
printf("%d",T->c);
j++;
if(j<n)
printf(" ");
else
printf("\n");
}
}
int main()
{
int x[1010],z[1010],i,n;
Tree *T=NULL;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%d",&x[i]);
for(i=0;i<n;i++)
scanf("%d",&z[i]);
creat(&T,z,0,n-1,x,0,n-1);
j=0;
printh(T,n);
}
return 0;
}