已知后序与中序排列,如何求先序排列?

  • 首先, 对于先序, 中序, 后序遍历的区别: 其实就是对于根节点的访问顺序不同而已, 先访问根节点即先序, 先左子树再根再右子树即中序, 先左子树再右子树最后根节点即后序访问.

  • 由上面的定义我们不难得到结论: 后序遍历的最后一个就是根节点.

  • 敲重点: 由上面的那个重要结论我们可以先由后序序列找到根节点, 然后根据这个根节点来对中序以及后序序列进行分割, 于是可以得到左右子树, 然后对左子树以及右子树进行递归地处理.

  • 就按这样一直做下去(先输出根,再递归); 模板概括为

    step1:找到根并输出

    step2:将中序,后序各分为左右两棵子树;

    step3:递归,重复step1,2;

#include <bits/stdc++.h>

using namespace std;

void solve (string mid, string after) {
    
    if (after.size() > 0) {
        char ch;
        ch = after[after.size() - 1];
        cout << ch;
        int k = mid.find(ch);

        //这里特别注意一下: after.substr(k,in.size()-k-1))是因为substr(下标,你想取的长度),比如string a = "1234567",a.substr(2,3)="345"
        solve(mid.substr(0, k), after.substr(0, k));
        solve(mid.substr(k + 1), after.substr(k, mid.size() - k - 1));
    }
}

int main() {
    string midStr, afterStr;
    cin >> midStr >> afterStr;
    solve(midStr, afterStr);
    return 0;
}
复制代码
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值