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

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

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

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

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

    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;
}