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

二叉树算法实战:美国血统重建与深度宽度计算

综述由AI生成二叉树算法实战:通过两道经典题目,演示了利用先序与中序遍历重建二叉树的方法,以及计算树的深度、宽度和最近公共祖先。重点在于递归思想的运用与 DFS/BFS 的实际编码实现,帮助读者掌握分治策略与树结构处理技巧。

星云发布于 2026/3/29更新于 2026/6/615 浏览
二叉树算法实战:美国血统重建与深度宽度计算

前言

本章节聚焦算法题实战,通过两道经典题目系统讲解数据结构与算法核心模块。以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。

一、美国血统 American Heritage

1.1 题目

链接:美国血统 American Heritage

图片描述

1.2 算法原理

这道题本质上是根据先序和中序遍历序列重建二叉树。解法同《求先序序列》,关键在于手动模拟一下过程,找出「相同子问题」,利用「递归」求解。

具体步骤如下:

  1. 处理左右子树:确定当前根节点后,在中序序列中划分左右子树的范围。
  2. 找根节点:在先序序列的第一个元素即为当前子树的根。
  3. 划分左右子树:根据根节点在中序中的位置,递归处理左半部分和右半部分。

1.3 代码

#include <iostream>
using namespace std;

string 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(0, a.size() - 1, 0, b.size() - 1);
    return 0;
}

二、二叉树问题

2.1 题目

链接:二叉树问题

图片描述

2.2 算法原理

这道题需要计算三个指标:深度、宽度和最近公共祖先(LCA)。

  • 深度:使用递归 DFS 即可,取所有子树深度的最大值加一。
  • 宽度:使用 BFS 宽搜,记录每一层的节点数,取最大值。
  • 最近公共祖先:两点之间的距离可以通过向上不断找父亲结点来计算。第一个重叠的位置,就是两者的最近公共祖先。可以一边寻找,一边计算结果。

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.size()) {
        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;
    while (x != 1) {
        dest[fa[x]] = dest[x] + 1;
        x = fa[x];
    }
    int len = 0;
    while (y != 1 && dest[y] == 0) {
        y = fa[y];
        len++;
    }
    cout << 2 * dest[y] + len << endl;
    return 0;
}

总结

本章通过两道经典二叉树算法题,巩固了递归、深搜、宽搜等核心思想。从美国血统的遍历重建,到二叉树深度、宽度与公共祖先求解,每道题都在训练分治思维与代码实现能力。算法之路无捷径,坚持刷题、理清思路、动手实现,能力便会稳步提升。

目录

  1. 前言
  2. 一、美国血统 American Heritage
  3. 1.1 题目
  4. 1.2 算法原理
  5. 1.3 代码
  6. 二、二叉树问题
  7. 2.1 题目
  8. 2.2 算法原理
  9. 2.3 代码
  10. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 AI 辅助开发的在线智能考试系统实战
  • Python 爬虫使用代理 IP 避免封禁的原理与实现方案
  • Java+Selenium 结合代理实现高效爬虫
  • Python 官方下载与 Windows 安装配置完整指南
  • Agent Memory 文献追踪:异构存储与经验记忆机制解析
  • C++ 基于传输与交换的 K-Medoids 聚类算法实现
  • FPGA 自适应滤波算法实现:LMS 到 RLS 及 Verilog 代码与案例
  • AI 时代的技术民主化:为什么文科生可能成为最大受益者?
  • OpenClaw(龙虾 AI)Windows 与 macOS 安装优缺点对比
  • AI 大模型研究热点:RAG、Agent、Mamba、LoRA 与 MoE 技术解析
  • Replay AI 翻唱工具教程:音轨分离与音色替换
  • C++ 动态 DP 详解:原理与实现
  • 7 篇值得关注的大模型领域最新论文
  • 大模型时代程序员的正确姿势与应对策略
  • Python Web UI 自动化测试:推送本地代码到 Git 远程仓库
  • Flutter 三方库 vertex_ai 的鸿蒙化适配指南
  • 后端数据脱敏:概念、场景与 Java 落地方案
  • Linux 进程控制
  • AI 绘画关键词网站效率提升实战:从数据预处理到模型加速
  • 基于 LoRA 微调多模态大模型 BLIP-2 的详细步骤

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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