
前言
本章节聚焦于二叉树的核心算法实战,通过两道经典题目串联起递归、遍历及树结构分析的关键知识点。我们将深入探讨如何从遍历序列重建树结构,以及如何高效计算树的深度、宽度与节点间距离。
一、美国血统 American Heritage
1.1 题目背景
给定一棵二叉树的中序遍历和先序遍历序列,要求输出其后序遍历序列。这是典型的利用遍历性质还原树结构的场景。

1.2 解题思路
核心在于利用先序遍历确定根节点,再结合中序遍历划分左右子树范围。这是一个典型的递归分治过程。
- 定位根节点:先序遍历的第一个元素即为当前子树的根。
- 划分区间:在中序遍历中找到该根节点的位置,其左侧为左子树,右侧为右子树。
- 递归构建:根据左右子树的大小,同步更新先序和中序的索引窗口,递归处理直到边界。
实际编码时,不需要真正构建出树节点对象,只需在递归过程中按后序顺序(左 - 右 - 根)输出即可,这样能节省空间且逻辑更直接。
1.3 参考实现
#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]
(l1, p - , l2 + , l2 + p - l1);
(p + , r1, l2 + p - l1 + , r2);
cout << b[l2];
}
{
cin >> a >> b;
(, a.() - , , b.() - );
;
}



