1 条题解
-
0
针对“根据前序和中序遍历求后序遍历”这一经典算法问题,以下是简化变量名并优化代码结构的 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; }
信息
- ID
- 2625
- 时间
- 555ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 2
- 上传者