1 条题解

  • 0
    @ 2026-6-22 19:00:55

    针对“根据前序和中序遍历求后序遍历”这一经典算法问题,以下是简化变量名并优化代码结构的 C++ 实现。

    核心思路

    ‌前序遍历 (Pre)‌:第一个元素是根节点。 ‌中序遍历 (In)‌:根节点将序列分为左子树和右子树。

    ‌递归构建‌:

    找到根在中序中的位置 k。 左子树长度 len = k - in_start。 递归处理左子树和右子树。 ‌后序输出顺序‌:先递归左子树,再递归右子树,最后输出根节点。

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    string pre, in;
    // p1: 前序起始下标, p2: 前序结束下标(不含)
    // i1: 中序起始下标, i2: 中序结束下标(不含)
    void dfs(int p1, int p2, int i1, int i2){
        if (p1 >= p2) return; // 空区间,直接返回
        
        char root = pre[p1]; // 根节点
        int k = i1;
        // 在中序遍历中找到根节点的位置
        while (in[k] != root) k++;
        int left_len = k - i1; // 左子树节点数量
        // 1. 递归左子树
        // 前序: [p1+1, p1+1+left_len), 中序: [i1, k)
        dfs(p1 + 1, p1 + 1 + left_len, i1, k);
        // 2. 递归右子树
        // 前序: [p1+1+left_len, p2), 中序: [k+1, i2)
        dfs(p1 + 1 + left_len, p2, k + 1, i2);
        // 3. 输出根节点 (后序遍历的核心:左右根)
        cout << root;
    }
    int main() {
        if (cin >> pre >> in) {
            dfs(0, pre.size(), 0, in.size());
            cout << endl;
        }
        return 0;
    }
    
    
    
    • 1

    信息

    ID
    2625
    时间
    555ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    2
    上传者