已知二叉树的两种遍历序列输出求另一种遍历序列

已知先序和中序求后序

假设先序序列为pre[],中序序列为in[],pre左端索引为preL,右端索引为preR,in左端索引为inL,右端索引为inR,先序遍历先访问根结点,中序遍历先访问左子树,再访问根结点,遍历in数组,找到与pre[preL]相等的位置tmp,此节点左边节点为左子树,右边节点为右子树,所以左子树节点数目为numLeft = tmp - inL,右子树节点数目为numRight = inR - tmp,左子树索引先序序列范围为[preL + 1, preL + numLeft],右子树先序序列索引范围为[pre + numLeft + 1, preR],左子树中序序列索引范围为[inL, inL + numLeft - 1], 右子树中序序列索引范围为[tmp + 1, inR]。通过递归遍历子树模拟后序遍历。

void post(int preL, int preR, int inL, int inR)
{
    if(inL > inR)   return;	//到达叶子节点
    int index = inL;
    int root = pre[preL];	//当前子树根结点
    while (in[index] != pre[preL])	//寻找中序序列中根结点位置
    {
        index++;
    }
    int tmp = index - inL;
    post(preL + 1, preL + tmp, inL, index - 1);	//访问左子树
    post(preL + tmp + 1, preR, index + 1, inR);	//访问右子树
    cout << root << endl;	//输出根结点
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值