力扣(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 那样早停。

相关推荐
BK贝壳3 小时前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
2601_966949654 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
拓恒技术6 小时前
无人机巡检AI算法的工程化落地:从需求到交付的5个核心环节
人工智能·算法·无人机
晨曦中的暮雨6 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
怕浪猫7 小时前
Claude Code vs Codex:Computer Use 实现原理深度拆解
算法·面试·github
文丑颜不良啊8 小时前
LeetCode876~900题目解析
java·leetcode
罗西的思考8 小时前
AI 时代的 “房谋杜断”:如何培养能力、品味与判断力
人工智能·算法·机器学习
淡海水8 小时前
07-02-源码-.NET Core GC分配路径
算法·unity·c#·.netcore·gc·1024程序员节
在世修行9 小时前
智学文枢:页面切换与跨页数据预填
python·桌面应用·signal·1024程序员节·pyside·跨页跳转·状态预填
2601_962885729 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python