| 树的遍历 |
| Description |
给定某二叉树的前序序列和中序序列,输出该二叉树的后序序列。(输入的前序遍历和中序遍历的结果中都不含重复的数字)
第一行是n 接下来一行有n个数表示前序序列 最后一行是中序序列 对于30%的数据,n<=20 对于60%的数据,n<=1000 对于100%的数据,n<=100000 输出树的后序序列输入:
5
3 9 20 15 7
9 3 15 20 7
输出:
9 15 7 20 3 注意最后一位数字后没有空格
| 解题思路: |



#include
const int N = 1e5;
int n;
int pre[N];
int in[N];
int cnt;
void post(int pre[],int in[],int len){
if(len<=0)
{return;}
int root = pre[0];
int k=0;
while(in[k]!=root)k++;
// if(k==0){printf("%d ",root);return;}
int inleft[N],preleft[N],inright[N],preright[N];
for(int i=0;i<=k-1;i++)
inleft[i]=in[i];
for(int i=1;i<=k;i++)
preleft[i-1]=pre[i];
for(int i=k+1;i<=len-1;i++)
inright[i-k-1]=in[i];
for(int i=k+1;i<=len-1;i++)
preright[i-k-1]=pre[i];
int leftlen = k;
int rightlen = len-k-1;
post(preleft,inleft,leftlen);
post(preright,inright,rightlen);
if(cnt==0)
printf("%d",root);
else
printf(" %d",root);
cnt++;
}
int main(){
scanf("%d",&n);
for(int i = 0;i<n;i++)
scanf("%d",&pre[i]);
for(int i = 0;i<n;i++)
scanf("%d",&in[i]);
post(pre,in,n);
return 0;
}