当前位置: 首页 > 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.xdnf.cn/news/1275265.html

相关文章:

  • 【自用】JavaSE--IO流(二)--缓冲流、转换流、打印流、数据流、序列化流、IO框架
  • Redis 数据类型和单线程模型补充
  • Spring的三层架构及其各个层用到注解详细解释。
  • reuse: for booting my spring project with mvn in Windows command line
  • 基于 InfluxDB 的服务器性能监控系统实战(三)
  • Ubuntu 安装 Elasticsearch
  • Elasticsearch 搜索模板(Search Templates)把“可配置查询”装进 Mustache
  • 人工智能-python-机器学习-决策树与集成学习:决策树分类与随机森林
  • 深入浅出DBSCAN:基于密度的聚类算法详解与Python实战
  • redis集群-本地环境
  • AAAI 2025丨具身智能+多模态感知如何精准锁定目标
  • BGP笔记整理
  • CST MATLAB 联合仿真超材料开口谐振环单元
  • PWM波的频谱分析及matlab 验证[电路原理]
  • 企业高性能web服务器——Nginx
  • PySpark
  • 【redis初阶】------List 列表类型
  • Mysql 8.0 新特性
  • drippingblues靶机通关练习笔记
  • 搭建本地 Git 服务器
  • nginx-主配置文件
  • Flask多进程数据库访问问题详解
  • Words or Vision Do Vision-Language Models Have Blind Faith in Text
  • Baumer高防护相机如何通过YoloV8深度学习模型实现道路坑洼的检测识别(C#代码UI界面版)
  • 基于FFmpeg的B站视频下载处理
  • 配置timer控制 IO的输出(STC8)
  • 浏览器CEFSharp88+X86+win7 之js交互开启(五)
  • 【LeetCode】102 - 二叉树的层序遍历
  • MySQL 处理重复数据详细说明
  • DBAPI 实现不同角色控制查看表的不同列