/* 1.后序最后一个---找到root;
2.搜索root-----将中序分为两段;
3.如此循环
前序:acehifbgzk
后序:hiefczgkba
中序:heicfazgbk
画图
a
c b
e f g k
h i z
输入前序S[]=#acehifbgzk, n=11;
中序T[]=0heicfazgbk传入solve(ls=ls+1=2,rs=11,lt=1,rt=11);//rs为前序长度,rt为中序长度;
S[1]=a,在T[6]中找到a ,pos=6;
左子树大小len=5
递归左子树lc=solve(ls=ls+1=2,rs=ls+len=6,lt=1,rt=pos-1=5)
S[2]=c,在T[4]中找到c,pos=5......
递归右子树solve(ls=ls+len+1=7,rs=11,lt=pos+1=6,rt=11)
......
*/#include<bits/stdc++.h>usingnamespace std;char S[1000],T[1000];int n;intsolve(int ls,int rs,int lt,int rt)//将前序遍历和中序遍历分别存在S和T中 {if(ls>rs)return0;//这是一个空结点 if(ls==rs){printf("For %c,it is a leaf\n",S[ls]);//输出它是一个叶子 return ls;//递归的最底层 }int pos;for(int i=lt;i<=rt;i++){if(T[i]==S[ls]){
pos=i;break;}}int len=pos-lt;//左子树的大小 int lc=solve(ls+1,ls+len,lt,pos-1);//递归左子树 起点+1,截至位置6int rc=solve(ls+len+1,rs,pos+1,rt);//递归右子树 起点左子树大小+2,截至位置11printf("For\40%c,left child is%c,right child is%c\n",S[ls],S[lc],S[rc]);//ls:父 lc:左孩 rc:右孩 return ls;}intmain(){scanf("%s",S+1);n=strlen(S+1);S[0]='#';scanf("%s",T+1);solve(1,n,1,n);return0;}
/* 1.后序最后一个---找到root;
2.搜索root-----将中序分为两段;
3.如此循环
前序:acehifbgzk
后序:hiefczgkba
中序:heicfazgbk
画图
a
c b
e f g k
h i z
输入前序S[]=#acehifbgzk, n=11;
中序T[]=0heicfazgbk传入solve(ls=ls+1=2,rs=11,lt=1,rt=11);//rs为前序长度,rt为中序长度;
S[1]=a,在T[6]中找到a ,pos=6;
左子树大小len=5
递归左子树lc=solve(ls=ls+1=2,rs=ls+len=6,lt=1,rt=pos-1=5)
S[2]=c,在T[4]中找到c,pos=5......
递归右子树solve(ls=ls+len+1=7,rs=11,lt=pos+1=6,rt=11)
......
*/#include<bits/stdc++.h>usingnamespace std;char S[1000],T[1000];int n;intsolve(int ls,int rs,int lt,int rt)//将前序遍历和中序遍历分别存在S和T中 {if(ls>rs)return0;//这是一个空结点 if(ls==rs){printf("For %c,it is a leaf\n",S[ls]);//输出它是一个叶子 return ls;//递归的最底层 }int pos;for(int i=lt;i<=rt;i++){if(T[i]==S[ls]){
pos=i;break;}}int len=pos-lt;//左子树的大小 int lc=solve(ls+1,ls+len,lt,pos-1);//递归左子树 起点+1,截至位置6int rc=solve(ls+len+1,rs,pos+1,rt);//递归右子树 起点左子树大小+2,截至位置11printf("For\40%c,left child is%c,right child is%c\n",S[ls],S[lc],S[rc]);//ls:父 lc:左孩 rc:右孩 return ls;}intmain(){scanf("%s",S+1);n=strlen(S+1);S[0]='#';scanf("%s",T+1);solve(1,n,1,n);return0;}