这道题有两种解法,第一种解法是根据先序和后序遍历建立二叉树,然后再后序遍历二叉树,详情见5-23还原二叉树
第二种方法是直接根据先序和后续遍历直接求出后序遍历数据,不需要建树。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 30
typedef struct tree *Bintree;
struct tree
{
int data;
Bintree left;
Bintree right;
};
typedef struct node
{
int data[MAX];
int top;
}stack;
stack *createstack()
{
stack *s;
s=malloc(sizeof(stack));
s->top=-1;
return s;
}
void push(stack *s,int item)
{
s->data[++s->top]=item;
}
int pop(stack *s)
{
return s->data[s->top--];
}
Bintree createtree(int pre[],int in[],int N)
{
Bintree T;
int i;
if(!N)return NULL;
T=malloc(sizeof(struct tree));
T->data=pre[0];
for(i=0;i<N;i++)
{
if(pre[0]==in[i])break;
}
T->left=createtree(pre+1,in,i);
T->right=createtree(pre+i+1,in+i+1,N-i-1);
return T;
}
void postorder(Bintree T)
{
if(T)
{
postorder(T->left);
postorder(T->right);
printf("%d ",T->data);
}
}
void solve(int pre[],int in[],int post[],int prel,int inl,int postl,int length)
{
int root,i,L,R;
if(length==0)//注意递归后的节点只存在一个子节点的情况,另一边length就等于0
return;
if(length==1)
{
post[postl]=pre[prel];
return;
}
root=pre[prel];
post[postl+length-1]=root;
for(i=0;i<length;i++)
if(in[inl+i]==root)
break;
L=i;
R=length-i-1;
solve(pre,in,post,prel+1,inl,postl,L);//左子树
solve(pre,in,post,prel+L+1,inl+L+1,postl+L,R);//右子树
}
main()
{
stack *q;
char str[10];
int pre[10],in[10],post[10],N,i,a=0,b=0,x;
q=createstack();
scanf("%d",&N);
for(i=0;i<2*N;i++)
{
scanf("%s",str);
if(str[1]=='u')//if(str[1]=='u')
{
scanf("%d",&x);
pre[a++]=x;
push(q,x);
}
else
in[b++]=pop(q);
}
solve(pre,in,post,0,0,0,N);
for(i=0;i<N-1;i++)
printf("%d ",post[i]);
printf("%d\n",post[N-1]);
}