/*
输入先序和中序,构造二叉树,并输出该二叉树的层序、前序、中序、后序遍历结构
输入后序和中序,构造二叉树,并输出该二叉树的层序、前序、中序、后序遍历结构
*/
#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;
}
01-08 06:13