二叉树最小深度:DFS与BFS算法解析
1. 题目解析与核心思路二叉树的最小深度是LeetCode上一道经典的二叉树遍历题目。题目要求我们找到从根节点到最近叶子节点的最短路径上的节点数量。这里需要特别注意叶子节点的定义——它是指没有子节点的节点。与求二叉树的最大深度不同最小深度需要考虑左右子树是否存在的情况。举个例子如果一个节点的左子树为空而右子树不为空那么这个节点的最小深度应该由右子树决定而不是简单地取左右子树深度的最小值。1.1 关键概念澄清很多人初次接触这个问题时容易陷入一个误区认为最小深度就是简单地递归比较左右子树的最小深度然后加1。这种思路对于平衡二叉树是适用的但对于极端情况如斜树所有节点都只有左子树或右子树就会出错。正确的理解应该是最小深度是指从根节点到最近的叶子节点的路径长度。叶子节点是指没有左右子节点的节点。因此我们需要找到这样一条最短路径。2. 解法思路与算法选择2.1 深度优先搜索(DFS)解法DFS是最直观的解法之一。我们可以递归地计算每个节点的最小深度如果当前节点为空返回0如果当前节点的左子树为空返回右子树的最小深度1如果当前节点的右子树为空返回左子树的最小深度1如果左右子树都不为空返回左右子树最小深度的较小值1这种解法的时间复杂度是O(n)因为每个节点都会被访问一次。空间复杂度在最坏情况下树完全不平衡是O(n)在最好情况下树完全平衡是O(logn)。2.2 广度优先搜索(BFS)解法BFS是另一种有效的解法特别适合寻找最短路径的问题。我们可以按层遍历二叉树当遇到第一个叶子节点时当前的层数就是最小深度。BFS的实现通常使用队列将根节点入队当队列不为空时进行以下操作记录当前队列的大小即当前层的节点数遍历当前层的所有节点如果遇到叶子节点左右子节点都为空立即返回当前深度否则将非空子节点入队深度加1继续处理下一层BFS的时间复杂度也是O(n)但在某些情况下最小深度较小时会比DFS更高效因为它不需要遍历整棵树。空间复杂度在最坏情况下是O(n)。3. 代码实现与详细解析3.1 DFS实现Python版本class Solution: def minDepth(self, root: TreeNode) - int: if not root: return 0 if not root.left: return self.minDepth(root.right) 1 if not root.right: return self.minDepth(root.left) 1 return min(self.minDepth(root.left), self.minDepth(root.right)) 1这段代码清晰地体现了我们之前讨论的四种情况。需要注意的是递归终止条件不仅包括节点为空的情况还包括处理单侧子树为空的情况。3.2 BFS实现Python版本from collections import deque class Solution: def minDepth(self, root: TreeNode) - int: if not root: return 0 queue deque([root]) depth 1 while queue: level_size len(queue) for _ in range(level_size): node queue.popleft() if not node.left and not node.right: return depth if node.left: queue.append(node.left) if node.right: queue.append(node.right) depth 1 return depthBFS实现中使用了双端队列deque来提高效率。我们维护一个当前层的节点队列每次处理完一层后深度加1。当遇到第一个叶子节点时立即返回当前深度。4. 边界条件与特殊情况处理4.1 空树处理当输入是空树root为None时两种解法都直接返回0。这是一个合理的定义因为空树没有任何路径。4.2 单节点树只有一个根节点的树的最小深度是1因为根节点本身就是叶子节点。我们的两种解法都能正确处理这种情况。4.3 斜树处理对于所有节点都只有左子树或右子树的斜树最小深度等于节点数量。这是最容易出错的情况也是测试我们算法正确性的重要案例。4.4 完全二叉树对于完全二叉树所有层都完全填满除了最后一层可能不满我们的算法也能正确计算最小深度通常等于树的高度。5. 算法优化与性能分析5.1 DFS优化思路原始的DFS实现虽然正确但在某些情况下会有不必要的递归调用。我们可以通过提前终止来优化维护一个全局最小深度变量在递归过程中如果当前深度已经大于记录的最小深度可以提前终止该路径的探索只有当找到更小的深度时才更新记录这种优化在最坏情况下时间复杂度不变但在平均情况下可能减少递归次数。5.2 BFS的性能优势BFS在寻找最小深度这类问题上天然具有优势因为它是一层一层地搜索一旦找到叶子节点就可以立即返回。对于最小深度较小的树BFS通常比DFS更快找到解。5.3 时空复杂度对比算法时间复杂度空间复杂度适用场景DFSO(n)O(h)树较平衡时空间效率高BFSO(n)O(w)最小深度较小时更高效其中h是树的高度w是树的最大宽度。6. 常见错误与调试技巧6.1 错误实现示例一个常见的错误实现是简单地将最大深度的解法修改为取最小值def minDepth(root): if not root: return 0 return min(self.minDepth(root.left), self.minDepth(root.right)) 1这种实现在斜树情况下会返回错误结果因为它没有考虑单侧子树为空的情况。6.2 调试建议首先测试空树和单节点树然后测试斜树只有左子树或只有右子树最后测试普通二叉树可以使用小规模的树3-5个节点手动验证结果6.3 可视化调试技巧对于更复杂的树结构可以先将树可视化def printTree(root, level0): if root: printTree(root.right, level 1) print( * 4 * level -, root.val) printTree(root.left, level 1)这样可以帮助理解树的结构和算法的执行过程。7. 实际应用与扩展思考7.1 实际应用场景二叉树的最小深度问题在实际中有多种应用文件系统目录结构分析游戏AI中的最短路径搜索网络路由中的最短路径计算组织结构图中的最短汇报路径7.2 问题变种与扩展输出最小深度路径上的所有节点统计所有最小深度路径的数量加权二叉树的最小深度边有权重多叉树的最小深度7.3 与其他问题的联系这个问题与以下算法问题有密切联系二叉树的最大深度二叉树的直径二叉树的所有路径二叉树的最小高度理解它们之间的关系可以帮助建立更系统的二叉树算法知识体系。

相关新闻

微信小程序马拉松报名系统开发与优化实践

微信小程序马拉松报名系统开发与优化实践

1. 项目背景与核心价值去年参与某城市马拉松赛事服务时,我发现传统报名方式存在诸多痛点:PC端报名流程繁琐、移动端适配差、支付成功率低、信息核对困难。这促使我开发了这套基于微信小程序的马拉松报名系统,上线后使某中型赛事报名转化率提升…

2026/10/15 10:25:22 阅读更多 →
CODESYS MC_GearIn 电子齿轮主从轴同步实战指南

CODESYS MC_GearIn 电子齿轮主从轴同步实战指南

简介:这份文档面向CODESYS运动控制初学者与自动化工程师,聚焦MC_GearIn功能块的应用,解决主从轴电子齿轮同步运动控制的入门问题。内容在MC_Power程序基础上扩展,讲解如何创建X、Y两个虚轴并设置模数1,通过MC_GearIn配…

2026/10/15 10:25:22 阅读更多 →
电动汽车市场现状与交付周期解析

电动汽车市场现状与交付周期解析

1. 电车市场现状与矛盾现象解析2023年全球电动汽车市场出现了一个耐人寻味的现象:一方面整体市场增速明显放缓,部分区域甚至出现销量同比下滑;另一方面,某些头部品牌依然维持着长达数月的交付等待期。这种看似矛盾的市场表现&…

2026/10/15 10:24:21 阅读更多 →

最新新闻

词向量、句向量与文章向量:NLP语义计算的工程化落地指南

词向量、句向量与文章向量:NLP语义计算的工程化落地指南

1. 这不是“黑箱”,而是你每天都在用的语言底层逻辑 “词向量表示和句向量、文章向量计算方法”——光看标题,很多人第一反应是:这又是个AI论文里的术语堆砌。但事实恰恰相反:你昨天用手机输入法打出“我想吃火锅”,系…

2026/10/15 11:18:51 阅读更多 →
EV纯电汽车Simulink整车建模:四层能量流架构与工程避坑指南

EV纯电汽车Simulink整车建模:四层能量流架构与工程避坑指南

简介:本资源是一套完整的电动汽车(EV)动力系统Simulink仿真模型,面向车辆工程、电力电子与控制方向的本科生、研究生及MATLAB/Simulink初学者,用于理解纯电汽车核心部件建模与系统级协同仿真。模型覆盖电池&#xff08…

2026/10/15 11:18:51 阅读更多 →
Cocos Creator编译工程逆向还原工具解析

Cocos Creator编译工程逆向还原工具解析

1. 工具定位与核心价值这个工具的出现解决了Cocos Creator开发者面临的一个典型痛点——当手头只有编译后的项目文件却需要回溯原始工程结构时,传统方式往往需要耗费大量时间进行手工逆向。我在实际项目协作中遇到过多次类似场景:接手遗留项目时发现只有…

2026/10/15 11:18:51 阅读更多 →
产品思维识人:用同理心与系统能力洞察他人

产品思维识人:用同理心与系统能力洞察他人

梁宁老师在《产品思维30讲》里,讲了一个非常有趣的观点:产品的本质不是功能,而是人与世界的连接方式。我一直记着这句话,学完这门课,我又把课程回听了一遍,琢磨了一个问题——如果产品思维的这套操作系统&a…

2026/10/15 11:18:51 阅读更多 →
Java Optional类:优雅处理空指针异常的最佳实践

Java Optional类:优雅处理空指针异常的最佳实践

1. Optional 空指针优化详解在Java开发中,NullPointerException(空指针异常)是最常见也是最令人头疼的问题之一。它就像程序中的定时炸弹,随时可能在运行时爆炸。传统的防御性编程方式(如大量的if-null检查&#xff09…

2026/10/15 11:18:51 阅读更多 →
市面上有哪些是真正高效的降AIGC网站(规避AIGC机器检测)

市面上有哪些是真正高效的降AIGC网站(规避AIGC机器检测)

本篇结合全网实测数据,精选千笔AI、笔捷 AI、豆包、DeepSeek、QuillBot、StealthWriter共 6 款主流工具,重点对比降 AI 率真实效果、降重能力、学术合规、免费权益、适配场景,附完整对比表格,告诉你哪些是真好用、哪些是智商税&am…

2026/10/15 11:17:51 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →