#include<stdio.h>
//pre前序序列,zhong中序序列,pos后序序列
int pre[100],zhong[100],pos[100];
int n,t;
//找到元素K在中序序列中的位置
int find(int k,int s,int e){
for(int i=s;i<=e;i++)
if(zhong[i] == k)
return i;
}
//转化为后序序列
void to_hou(int zs,int ze,int ps,int pe){
pos[n--] = pre[ps];//后序序列的遍历顺序为左根右,pre为根左右
int k;
k = find(pre[ps],zs,ze);
//因为是从后往前存储,所以存储顺序应该为根右左,所以应当保存完根节点之后再对右子树进行处理,最后存储左子树
//如果存在右子树
if(ze-k >0) to_hou(k+1,ze,ps+k-zs+1,pe);
//如果存在左子树
if(k-zs >0) to_hou(zs,k-1,ps+1,ps+k-zs);
}
int main(){
scanf("%d",&n);
t = n;//因为在存储过程中n的值发生了改变,所以用一个变量t来存储n
for(int i=1;i<=n;i++) scanf("%d",&pre[i]);
for(int i=1;i<=n;i++) scanf("%d",&zhong[i]);
to_hou(1,n,1,n);
for(int i=1;i<=t;i++) printf("%d ",pos[i]);
return 0;
}
根据先序序列和中序序列得到后序序列(C语言
最新推荐文章于 2022-06-23 21:41:51 发布