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

二叉树深度计算与先序序列重构算法解析

二叉树深度计算与先序序列重构算法解析。针对二叉树深度计算及由中序后序序列还原先序遍历两种经典问题提供 C++ 解决方案。深度计算采用递归取左右子树最大值加一;序列还原利用后序根节点定位,结合中序划分左右子树范围递归构建。代码包含完整逻辑与注释,适合算法基础巩固。

DataScient发布于 2026/3/28更新于 2026/6/1420 浏览
二叉树深度计算与先序序列重构算法解析

前言

本文聚焦于二叉树的两个经典操作:计算树的最大深度,以及根据中序和后序遍历序列还原先序遍历。这两个问题都深刻体现了递归思想在树形结构处理中的核心作用。

二叉树深度

题目描述

给定一棵二叉树,求其最大深度(高度)。

核心思路

二叉树的高度定义为根节点到最远叶子节点的最长路径上的节点数。递归公式非常直观:

Height(root) = 1 + max(Height(left), Height(right))

若节点为空,高度为 0。通过 DFS 遍历整棵树即可得出结果。

代码实现

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1e6 + 10;
int l[N], r[N]; // 存储左右子节点索引

// 递归计算深度
int dfs(int root) {
    if (!root) return 0;
    return max(dfs(l[root]), dfs(r[root])) + 1;
}

int main() {
    int n;
    cin >> n;
    // 输入每个节点的左右子节点
    for (int i = 1; i <= n; i++) {
        cin >> l[i] >> r[i];
    }
    // 从根节点 1 开始计算
    cout << dfs(1) << endl;
    return 0;
}

求先序排列

题目描述

已知一棵二叉树的中序遍历序列和后序遍历序列,求其先序遍历序列。

核心思路

后序遍历的最后一个元素一定是当前子树的根节点。找到该根节点在中序遍历中的位置,即可将中序序列划分为左子树和右子树部分。

  1. 确定根节点(后序序列末尾)。
  2. 在中序序列中找到根节点位置 p。
  3. 递归处理左子树(中序 [l1, p-1],后序对应区间)。
  4. 递归处理右子树(中序 [p+1, r1],后序对应区间)。
  5. 输出顺序为:根 -> 左 -> 右。

代码实现

#include <iostream>
#include <string>
using namespace std;

string a, b; // a 为中序,b 为后序

void dfs(int l1, int r1, int l2, int r2) {
    // 递归出口:区间无效
    if (r1 < l1) return;

    // 确立根节点并输出(先序特性)
    cout << b[r2];

    // 寻找中序序列中的根节点位置
    int p = l1;
    while (a[p] != b[r2]) p++;

    // 递归处理左右子树
    // 左子树:中序 [l1, p-1],后序长度相同
    dfs(l1, p - 1, l2, l2 + p - l1 - 1);
    // 右子树:中序 [p+1, r1],后序剩余部分
    dfs(p + 1, r1, l2 + p - l1, r2 - 1);
}

int main() {
    cin >> a >> b;
    dfs(0, a.size() - 1, 0, b.size() - 1);
    return 0;
}

总结

这两道题是树形结构递归应用的典型代表。第一题考察对树高定义的理解,第二题考察序列特征与递归划分的结合。掌握这类问题的关键在于找准递归的终止条件和状态转移方程。在实际刷题中,建议多画图辅助理解区间变化,避免边界错误。

目录

  1. 前言
  2. 二叉树深度
  3. 题目描述
  4. 核心思路
  5. 代码实现
  6. 求先序排列
  7. 题目描述
  8. 核心思路
  9. 代码实现
  10. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • GLM-ASR-Nano-2512 快速部署与中文语音识别实战
  • Soft Actor-Critic (SAC) 算法原理与 PyTorch 实现
  • 数据结构基础:栈与队列的实现原理
  • Java 对象更新时避免空字段覆盖的几种拷贝方案
  • Vue 与 C++:前端与系统开发的本质差异
  • Vue 核心语法与原理实战指南
  • OpenCode 开源 AI 编程助手介绍
  • FPGA 实现高速数字信号处理的核心技术与工程实践
  • Stable Diffusion 基石:潜在扩散模型(LDMs)技术详解
  • 扩散模型详解:从 DDPM 到 Stable Diffusion 再到 DiT 的技术演进
  • Agentic RAG 技术实践:基于 LangChain 与 OpenAI
  • 相干伊辛机在医疗及医疗 AI 领域的应用前景
  • 2026 年 3 月 18 日 AI 行业前沿:算力竞赛、智能体落地与产业新范式
  • Qwen3.5 核心特性详解:原生多模态与 Agent 能力解析
  • Java JDK 安装与环境配置教程(Windows + macOS 通用)
  • Presentation AI:开源 AI 演示文稿生成工具
  • 基于 SpringBoot+Vue 的家政服务平台管理系统设计与实现
  • C++ 类与对象进阶特性与编译器优化
  • 大模型量化技术原理:LLM.int8()与GPTQ
  • VsCode 远程开发时 Github Copilot 代码提示失效排查指南

相关免费在线工具

  • 加密/解密文本

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