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

二叉树深度求解与中后序转先序实战

二叉树深度通过递归左右子树高度取最大值加一得出;先序排列利用后序序列末尾确定根节点,结合中序序列划分左右子树范围递归输出。两题核心均为递归思想应用,适合基础算法训练。

数字游民发布于 2026/3/27更新于 2026/6/1040 浏览
二叉树深度求解与中后序转先序实战

在这里插入图片描述

本章节聚焦算法题实战,系统讲解算法模块。以题带点,通过代码实现帮助大家快速提升代码能力。

一、二叉树深度求解

题目背景

链接:二叉树深度

在这里插入图片描述

核心思路

计算二叉树高度其实是个经典的递归场景。直观理解,一棵树的高度等于左右子树高度的最大值再加一(根节点本身)。

这里有个关键点要注意:如果当前节点为空,返回 0 作为基准情况。在递归过程中,我们不需要构建复杂的树结构,直接利用数组存储的左右孩子索引即可遍历。这种基于数组的存储方式在处理完全二叉树或给定父子关系时非常高效。

代码实现

#include <iostream>
using namespace std;

const int N = 1e6 + 10;
int l[N], r[N]; // 分别存储左孩子和右孩子的索引

// 深度优先搜索计算高度
int dfs(int root) {
    if (!root) return 0; // 空节点高度为 0
    // 递归计算左右子树高度,取最大值并加 1
    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]; // 输入每个节点的左右孩子
    cout << dfs(1) << endl; // 从根节点 1 开始计算
    return 0;
}

二、求先序排列

题目背景

链接:求先序排列

在这里插入图片描述

核心思路

这道题考察的是根据中序和后序序列还原先序序列。处理这类问题的关键在于定位根节点。

在后序遍历中,最后一个元素一定是整棵树的根节点。找到这个根节点后,在中序遍历序列里就能把它切开,左边是左子树的中序,右边是右子树的中序。知道了左子树的长度,就能对应到后序序列中去划分左右子树的后序区间。

这个过程天然适合递归。每次递归确定当前区间的根节点,输出它,然后递归处理左右子树。注意边界条件的判断,当区间无效时直接返回。

代码实现

#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]
    // 左子树后序范围:[l2, l2 + (p - l1) - 1]
    dfs(l1, p - 1, l2, l2 + p - l1 - 1);
    
    // 递归处理右子树
    // 右子树中序范围:[p+1, r1]
    // 右子树后序范围:[l2 + p - l1, r2 - 1]
    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. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • OpenWebUI 联网搜索实战:SearXNG 配置本地大模型实时信息
  • Ubuntu 24.04 本地部署 Open WebUI 与 Ollama
  • FPGA 时钟约束实战:create_clock 与 create_generated_clock 详解
  • AI 时代产品经理全流程落地管控方法:从需求到上线
  • Python IDLE 入门指南:快速上手 Python 自带集成开发环境
  • 直流无刷电机 FOC 控制算法详解
  • Sambert-Hifigan 部署教程:WebUI 与 API 双模式
  • SBUS 协议深度解析:原理、硬件与 STM32 实战
  • Stable Diffusion WebUI 启动报错:MessageFactory 缺少 GetPrototype 属性修复方案
  • JavaScript 简介:跨平台脚本语言入门
  • Python 2026 发展局势:AI 时代的通用基础设施语言
  • AI 产品经理核心技能体系与职业成长路径
  • Java 导出 Excel 的主流方案:POI、EasyExcel 与模板引擎实战
  • C++11 核心特性实战:Lambda、移动语义与模板进阶
  • Web Unlocker API 解决 AI 训练数据集网页抓取难题
  • OpenClaw 接入 QVeris:为 AI 助手赋予实时数据查询能力
  • GitHub 访问加速实战指南:5 种常用提速方案
  • Python 爬取微信公众号:法律风险、反爬机制与合规指南
  • C++ 递归实战:汉诺塔问题详解
  • 基于 Java+SpringBoot+Vue 的口腔牙科诊所预约管理系统

相关免费在线工具

  • 加密/解密文本

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