/*
输入先序和中序,构造二叉树,并输出该二叉树的层序、前序、中序、后序遍历结构
输入后序和中序,构造二叉树,并输出该二叉树的层序、前序、中序、后序遍历结构
*/
#include <stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct node{
char data;
struct node *lchild;
struct node *rchild;
}BTree;
BTree *createPre(char *pre,char *in,int n){
if(n<=0) return NULL;
char *p;
int k;
BTree *b;
b=(BTree *)malloc(sizeof(BTree));
b->data=*pre;
for(p=in;p<in+n;p++)
if(*p==*pre)
break;
k=p-in;
b->lchild=createPre(pre+1,in,k);
b->rchild=createPre(pre+k+1,p+1,n-k-1);
return b;
}
BTree *createPost(char *post,char *in,int n){
if(n<=0) return NULL;
char *p,r;
int k;
r=*(post+n-1);
BTree *b;
b=(BTree *)malloc(sizeof(BTree));
b->data=r;
for(p=in;p<in+n;p++)
if(*p==r)
break;
k=p-in;
b->lchild=createPost(post,in,k);
b->rchild=createPost(post+k,p+1,n-k-1);
return b;
}
void presort(BTree *b){
BTree *p,*st[10];
int top=-1;
p=b;
while(p!=NULL||top>-1){
while(p!=NULL){
printf("%c ",p->data);
top++;
st[top]=p;
p=p->lchild;
}
if(top>-1){
p=st[top];
top--;
p=p->rchild;
}
}
printf("\n");
}
void insort(BTree *b){
BTree *p,*st[10];
int top=-1;
p=b;
while(p!=NULL||top>-1){
while(p!=NULL){
top++;
st[top]=p;
p=p->lchild;
}
if(top>-1){
p=st[top];
top--;
printf("%c ",p->data);
p=p->rchild;
}
}
printf("\n");
}
void postsort(BTree *b){
BTree *p,*st[10];
int t1=-1,t2=-1,tag[10],f;
p=b;
while(p!=NULL||t1>-1){
if(p!=NULL){
t1++;
st[t1]=p;
t2++;
tag[t2]=1;
p=p->lchild;
}else{
p=st[t1];
t1--;
f=tag[t2];
t2--;
if(f==1){
t1++;
st[t1]=p;
t2++;
tag[t2]=2;
p=p->rchild;
}else{
printf("%c ",p->data);
p=NULL;
}
}
}
printf("\n");
}
void censort(BTree *b){
BTree *p,*qu[10];
int f=-1,r=-1;
p=b;
r++;
qu[r]=p;
while(f!=r){
f=(f+1)%10;
p=qu[f];
printf("%c ",p->data);
if(p->lchild!=NULL){
r=(r+1)%10;
qu[r]=p->lchild;
}
if(p->rchild!=NULL){
r=(r+1)%10;
qu[r]=p->rchild;
}
}
printf("\n");
}
int main()
{
char pre[100],in[100],post[100];
int n=7;
BTree *b;
gets(pre);
gets(in);
b=createPre(pre,in,n);
censort(b);
presort(b);
insort(b);
postsort(b);
gets(post);
gets(in);
b=createPost(post,in,n);
censort(b);
presort(b);
insort(b);
postsort(b);
return 0;
}