二叉树算法实战:美国血统与公共祖先求解
一、美国血统 American Heritage
题目
链接: Luogu P1827
给定一棵树的先序遍历和中序遍历序列,要求输出其后序遍历序列。
算法思路
已知先序和中序序列可以唯一确定一棵二叉树。核心在于找到根节点的位置,从而划分左右子树。
- 定位根节点:先序遍历的第一个元素即为当前子树的根。
- 划分区间:在中序遍历中找到该根节点,其左侧为左子树,右侧为右子树。
- 递归构建:根据左右子树的节点数量,递归处理剩余的先序和中序片段。
实际编码时,我们不需要显式构建树结构,直接在递归过程中按'左 - 右 - 根'的顺序输出即可得到后序遍历。
代码实现
#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++;
// 递归处理左子树
dfs(l1, p - 1, l2 + 1, l2 + p - l1);
// 递归处理右子树
dfs(p + 1, r1, l2 + p - l1 + 1, r2);
// 访问根节点(后序遍历顺序)
cout << b[l2];
}
int main() {
cin >> a >> b;
dfs(, a.() - , , b.() - );
;
}


