前言
本文聚焦于两道经典的二叉树算法题,通过实际代码实现来巩固递归、搜索等核心思想。内容涵盖根据遍历序列重建二叉树,以及计算树的深度、宽度与最近公共祖先。
一、美国血统 American Heritage
题目描述
给定一棵二叉树的中序遍历和前序遍历序列,要求输出其后序遍历序列。
算法思路
这道题的核心在于利用中序和前序遍历的特性来还原树结构。我们可以先手动模拟一遍过程,观察其中的「相同子问题」,从而设计递归方案。
具体思路是:
- 定位根节点:前序遍历的第一个元素即为当前子树的根。
- 划分左右子树:在中序遍历中找到根节点的位置,其左侧为左子树,右侧为右子树。
- 递归处理:分别对左右子树重复上述步骤。
代码实现
#include <iostream>
#include <string>
using namespace std;
string a, b; // a: 中序,b: 前序
void dfs(int l1, int r1, int l2, int r2) {
if (l1 > r1) return;
// 寻找中序遍历中根节点的位置
int p = l1;
while (a[p] != b[l2]) p++;
// 递归处理左右子树
// 左子树范围:[l1, p-1], [l2+1, l2+p-l1]
dfs(l1, p - 1, l2 + 1, l2 + p - l1);
// 右子树范围:[p+1, r1], [l2+p-l1+1, r2]
dfs(p + 1, r1, l2 + p - l1 + 1, r2);
// 后序遍历:根节点最后访问
cout << b[l2];
}
int main() {
cin >> a >> b;
dfs(, a.() - , , b.() - );
;
}


