力扣(LeetCode) 111: 二叉树的最小深度 - 解法思路

问题概述

给定一棵二叉树,找到它的最小深度。

最小深度 是从根节点到最近叶子节点的最短路径上的节点数量。

可视化说明

示例 1:最小深度 = 2

复制代码
        3
       / \
      9   20
          / \
         15  7

最短叶子路径:3 → 9(深度 2)

示例 2:最小深度 = 5

复制代码
    2
     \
      3
       \
        4
         \
          5
           \
            6

最短叶子路径:2 → 3 → 4 → 5 → 6(深度 5)

关键说明

  • 深度计算的是 节点数,不是边数
  • 叶子节点是 没有子节点 的节点
  • 最小深度是最短的根到叶子路径

解法 1:递归(DFS)

工作原理

使用 DFS 遍历两侧子树,注意缺失子节点的处理:

python 复制代码
class Solution:
    def minDepth(self, root):
        if not root:
            return 0
        if not root.left and not root.right:
            return 1
        left_depth = self.minDepth(root.left) if root.left else float('inf')
        right_depth = self.minDepth(root.right) if root.right else float('inf')
        return 1 + min(left_depth, right_depth)

复杂度分析

  • 时间复杂度: O(n) - 每个节点访问一次
  • 空间复杂度: O(h) - 递归栈深度

适用场景

  • 简单直观的 DFS
  • 理解最小深度逻辑
  • 仍是 O(n),但无法提前退出

解法 2:BFS(推荐)

工作原理

使用 BFS,在遇到第一个叶子时立即返回(最早的最小深度):

python 复制代码
from collections import deque

class Solution:
    def minDepth(self, root):
        if not root:
            return 0
        queue = deque([(root, 1)])
        while queue:
            node, depth = queue.popleft()
            if not node.left and not node.right:
                return depth
            if node.left:
                queue.append((node.left, depth + 1))
            if node.right:
                queue.append((node.right, depth + 1))
        return 0

复杂度分析

  • 时间复杂度: O(n) - 每个节点访问一次;由于提前退出,实际更快
  • 空间复杂度: O(n) - 队列最多容纳一层的节点

适用场景

  • 推荐 - 遇到首个叶子即可返回
  • 最小深度较小时通常更快
  • 迭代,易于理解

对比

方法 时间 空间 最佳适用
DFS(递归) O(n) O(h) 学习,逻辑直观
BFS(提前返回) O(n) O(n) 推荐 - 提前返回,通常更快

总结

最小深度用 BFS 最快:层序遍历遇到的第一个叶子就是答案。DFS 也可以,但无法像 BFS 那样早停。

相关推荐
weixin_307779131 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
丑陋小蚊子2 小时前
项目数据不能公开,就写清交付物
面试·求职招聘·大学生·简历·简历下载
海绵宝宝转agent5 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭5 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT5 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_949950636 小时前
练题簿在线免费刷题 从资料整理到考前自测
面试·职场和发展·pdf·word·刷题
2601_962071576 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
hetao17338377 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
卷无止境7 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路7 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数