根据二叉树前序遍历和中序遍历序列求解后序遍历的算法

问题模型:已知某二叉树前序遍历序列为1,2,3,4,5,6,中序遍历为3,2,4,1,6,5,设计程序计算后序序列。

关于这个问题你可以通过前序遍历和中序遍历创建一颗树,然后通过后序遍历进行求解,当然还可以直接根据已知两序列直接推理后序序列,本文将对这种分析进行介绍。

利用递归的思想,从前序序列可以确定根节点即首位元素,根据中序序列可以确定左右子树的节点集合,然后针对左右子树分别进行继续判定,具体算法表达如下:

void solve( int preL, int inL, int postL, int n )
{ if (n==0) return;
if (n==1) {post[postL] = pre[preL]; return;}
root = pre[preL];
post[postL+n-1] = root;
for (i=0; i<n; i++)
if (in[inL+i] == root) break;
L = i; R = n-L-1;
solve(preL+1, inL, postL, L);
solve(preL+L+1, inL+L+1, postL+L, R);
}
其中preL,inL,postL为3种序列首位坐标,数组pre,in,post分别表示序列,函数每执行一次即可确定一个局部子树的根节点在后序序列的位置,递归左右子树关键位置在于前中后序的首位位置,递归的结束条件(当n=0时,说明该子树的节点数量为0,不存在后序序列,所以就直接返回;当n=1时,说明该子树节点个数为1,序列就是节点自己,直接赋值即可)也是程序成功的关键。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值