当前位置: 首页 > news >正文

【经典算法】二叉树最小深度详解:递归解法与可视化分析

【经典算法】二叉树最小深度详解:递归解法与可视化分析

📌 简介

本文详细讲解如何求解二叉树的最小深度,涵盖二叉树基础、题目解析、递归解法、可视化分析及完整代码实现。通过清晰的示例和递归调用栈分析,帮助读者深入理解算法逻辑,掌握如何在实际项目中调用类方法解决问题。


📚 目录

  1. 🌳 二叉树介绍
  2. 📝 题目解析
  3. 🛠️ 解决方法
  4. 🔄 递归介绍与可视化分析
  5. 🔧 类的应用与调用方法
  6. 📊 总结

🌳 二叉树介绍

二叉树是一种每个节点最多有两个子节点(左子节点和右子节点)的树结构。常见术语:

  • 根节点(Root):树的顶层节点。
  • 叶子节点(Leaf):没有子节点的节点。
  • 深度(Depth):从根节点到某节点的路径长度。

示例二叉树

        1/ \2   3/ \4   5

📝 题目解析

问题描述

给定一个二叉树,求其最小深度(从根节点到最近叶子节点的最短路径上的节点数)。

关键点

  • 最小深度必须到叶子节点(即没有子节点的节点)。
  • 若某节点只有一个子节点,不能直接取最小值(需继续向下查找)。

示例

        1/2/3
  • 最小深度为 3(路径 1 → 2 → 3),而非 1(右子树为空,不能直接返回 1)。

🛠️ 解决方法

递归思路

  1. 终止条件:当前节点为空时,返回 0
  2. 递归计算左右子树深度
    • leftDepth = run(root->left)
    • rightDepth = run(root->right)
  3. 分情况处理
    • 左右子树均非空:返回 min(leftDepth, rightDepth) + 1
    • 至少一个子树为空:返回 leftDepth + rightDepth + 1(避免忽略非空子树)。

代码实现

class Solution {
public:int run(TreeNode* root) {if (!root) return 0;int leftDepth = run(root->left);int rightDepth = run(root->right);if (leftDepth == 0 || rightDepth == 0) {return leftDepth + rightDepth + 1;}return min(leftDepth, rightDepth) + 1;}
};

🔄 递归介绍与可视化分析

递归调用栈示例

以二叉树 [1, 2, 3, 4, 5] 为例:

        1/ \2   3/ \4   5

递归过程

  1. run(1) → 调用 run(2)run(3)
  2. run(2) → 调用 run(4)run(5)(均返回 1)。
  3. run(2) 返回 min(1, 1) + 1 = 2
  4. run(3) 是叶子节点,返回 1
  5. run(1) 返回 min(2, 1) + 1 = 2

可视化表格

递归调用leftDepthrightDepth返回值
run(4)001
run(5)001
run(2)112
run(3)001
run(1)212

🔧 类的应用与调用方法

调用步骤

  1. 构建二叉树:手动创建节点并连接。
  2. 实例化 Solution:调用 run 方法。

示例代码

int main() {// 构建二叉树 [1, 2, 3, 4, 5]TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);Solution solution;cout << "最小深度: " << solution.run(root) << endl; // 输出 2return 0;
}

📊 总结

  1. 核心逻辑:递归分治,区分左右子树是否为空。
  2. 时间复杂度:O(N),每个节点访问一次。
  3. 空间复杂度:O(H),递归栈深度(H 为树高)。
  4. 适用场景:二叉树最短路径问题(如游戏AI寻路、网络路由优化)。

进一步思考:如何用**迭代(BFS)**实现?欢迎评论区讨论!


🔗 相关题目

  • 二叉树的最大深度
  • 平衡二叉树判断

📢 互动
如果有疑问或建议,欢迎留言交流!

http://www.dtcms.com/a/324937.html

相关文章:

  • 深入解析C#并行编程:从并行循环到异步编程模式
  • PyCATIA深度解析:基于装配截面自动化创建参考几何平面群的专业方案
  • 锂电生产设备健康管理:基于预测性维护的智能化解决方案​
  • 【github.io静态网页 怎么使用 github.io 搭建一个简单的网页?】
  • Python与MySQL数据库交互实践:自动化数据插入系统
  • GPU版的Pytorch安装(Win11)
  • SpringBoot项目自定义静态资源映射规则
  • 【嵌入式】Linux的常用操作命令 (1)
  • SAP 121移动类型的说明
  • C野指针的概念与应对(源头、阻隔、定位)
  • STM32定时器与延时系统完整笔记
  • 【C#补全计划】万类之父中的方法
  • 使用单调栈解决力扣第42题--接雨水
  • 亚麻云之静态资源管家——S3存储服务实战
  • SSH远程连接TRAE时显示权限被拒绝检查方案
  • 游泳学习 — 蛙泳
  • 变量详解:创建初始化与内存管理
  • go加速配置(下载第三方库)
  • go语言运算符
  • Java变量的声明规则与Scanner的应用
  • 算法训练营day44 动态规划⑪ 1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
  • BGP实验
  • (三)全栈(部署)
  • 数学建模——回归分析
  • 解决 Linux 下 “E: 仓库xxx没有数字签名” 问题
  • C++高频知识点(十九)
  • CentOS7.9 离线安装mysql数据库
  • Python vs MATLAB:智能体开发实战对比
  • 安卓录音方法
  • Python描述符进阶:自定义文档与属性删除的艺术