
一、美国血统 American Heritage
1.1 题目描述
链接:美国血统 American Heritage (Luogu P1827)

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]
dfs(l1, p - , l2 + , l2 + p - l1);
(p + , r1, l2 + p - l1 + , r2);
cout << b[l2];
}
{
cin >> a >> b;
(, a.() - , , b.() - );
;
}



