跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

二叉树算法实战:美国血统与公共祖先求解

两道经典二叉树算法题实战解析。第一题“美国血统”利用中序与后序遍历重建二叉树,核心在于递归定位根节点并划分左右子树;第二题涵盖深度、宽度计算及最近公共祖先查找,分别应用深度优先搜索、广度优先搜索及路径回溯策略。此类训练有助于巩固分治思维与树形结构基础操作。

观心发布于 2026/3/28更新于 2026/10/2689 浏览
二叉树算法实战:美国血统与公共祖先求解

题目示意图

一、美国血统 American Heritage

1.1 题目描述

链接:美国血统 American Heritage (Luogu P1827)

题目图片

1.2 算法思路

这道题的核心在于利用遍历序列重建二叉树。已知中序和后序(或前序)序列,我们可以通过递归的方式还原结构。

具体步骤如下:

  1. 定位根节点:在后序遍历的末尾(或前序的开头)找到当前子树的根。
  2. 划分左右子树:在中序遍历中找到该根节点的位置,其左侧为左子树,右侧为右子树。
  3. 递归处理:对左右子树分别重复上述过程。

这种分治思想是解决树形结构问题的基础,关键在于准确计算递归窗口的边界。

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.() - );
     ;
}
dfs
1
1
// 递归处理右子树
// 右子树的中序范围 [p+1, r1]
// 右子树的后序范围 [l2+p-l1+1, r2]
dfs
1
1
// 输出根节点
int main()
dfs
0
size
1
0
size
1
return
0

二、二叉树问题

2.1 题目描述

链接:二叉树问题 (Luogu P3884)

题目图片

2.2 算法思路

本题综合考察了树的几个基本属性:深度、宽度以及最近公共祖先(LCA)。

  • 深度:使用深度优先搜索(DFS),递归计算每个节点的最大子树高度。
  • 宽度:使用广度优先搜索(BFS),按层遍历并记录每层的最大节点数。
  • 最近公共祖先:通过向上回溯父亲节点来寻找路径。对于两个节点 x 和 y,从 x 向上标记路径,然后从 y 向上找第一个已标记的节点,即为 LCA。距离计算则结合了两点到 LCA 的路径长度。

2.3 代码实现

// 二叉树问题
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

const int N = 110;
vector<int> tree[N];
int fa[N];      // f[i]: i 的父亲节点
int dest[N];    // dest[i]: x 到 i 经历的节点个数

// 计算深度
int dfs(int u) {
    int ret = 0;
    for (auto v : tree[u]) ret = max(ret, dfs(v));
    return ret + 1;
}

// 计算宽度
int bfs() {
    queue<int> q;
    q.push(1);
    int ret = 0;
    while (!q.empty()) {
        int sz = q.size();
        ret = max(ret, sz);
        while (sz--) {
            auto x = q.front();
            q.pop();
            for (auto v : tree[x]) q.push(v);
        }
    }
    return ret;
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i < n; i++) {
        int u, v;
        cin >> u >> v;
        tree[u].push_back(v);
        fa[v] = u;
    }

    // 深度
    cout << dfs(1) << endl;
    // 宽度
    cout << bfs() << endl;

    // 距离及最近公共祖先相关计算
    int x, y;
    cin >> x >> y;
    
    // 标记 x 到根的路径
    while (x != 1) {
        dest[fa[x]] = dest[x] + 1;
        x = fa[x];
    }
    
    // 从 y 向上找第一个有标记的节点
    int len = 0;
    while (y != 1 && dest[y] == 0) {
        y = fa[y];
        len++;
    }
    
    cout << 2 * dest[y] + len << endl;
    return 0;
}

这两道题涵盖了二叉树遍历、重建以及基础统计操作。在实际刷题过程中,建议先手动模拟小数据样例,理清递归边界,再动手编码。树形结构的题目往往逻辑清晰但细节繁多,注意数组下标和边界条件即可。

目录

  1. 一、美国血统 American Heritage
  2. 1.1 题目描述
  3. 1.2 算法思路
  4. 1.3 代码实现
  5. 二、二叉树问题
  6. 2.1 题目描述
  7. 2.2 算法思路
  8. 2.3 代码实现

更多推荐文章

查看全部
  • 无人机电源管理系统:升压降压电路设计
  • Visual C++ 6.0 在 Windows 11 下的安装与兼容性配置
  • 7 个 Python 实战项目代码示例
  • PyCharm 集成 GitHub Copilot:从环境准备到实战配置
  • OpenClaw 多机器人协作方案:组建虚拟员工团队
  • PostgreSQL 插件 pgvector 核心功能与版本演进总结
  • Whisper-medium.en 模型技术解析与集成实践
  • 基于 Java 标准库读取 CSV 实现天地图 POI 分类导入 PostGIS 数据库
  • AI 辅助快速生成 Mermaid 图表实战指南
  • Qwen3-VL-WEBUI 地标识别:旅游 AI 助手部署教程
  • 基于 Python 的币安期货交易机器人实战
  • C++ operator() 运算符重载详解
  • 基于 WebGIS 与百度天气接口的复古天气预报系统构建
  • AI 核心概念速通教程
  • AI 数据标注工具实战:效率提升与质量保障
  • 2025 年 AIGC 六大发展趋势与应用场景解析
  • Sharpa Robotics 量产视觉基触觉手 SharpaWave,0.005N 超敏感知 + 模块化设计
  • Kubernetes 与 AI 推理服务最佳实践
  • 数据结构常见排序算法汇总:插入、交换、选择与归并
  • 渐进式 AIGC 系统:Nano-Banana 2 绘画与 VEO/Sora 视频生成私有化部署

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online