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

问题概述

给定一个二叉树的根节点 root,返回它的最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。

可视化说明

示例 1:最大深度 = 3

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

从根到叶子的最长路径是:3 → 20 → 15(或 3 → 20 → 7)

深度 = 3 个节点

示例 2:最大深度 = 2

复制代码
    1
     \
      2

从根到叶子的最长路径是:1 → 2

深度 = 2 个节点

深度计算

  • 深度 = 从根节点到目标节点的节点数(包含根节点和目标节点)
  • 根节点的深度为 1
  • 空树的深度为 0
  • 最大深度 = 从根到任意叶子的最长路径

解法 1:递归(推荐)

工作原理

递归计算左右子树的深度,然后返回 1 + 两者的最大值:

python 复制代码
class Solution:
    def maxDepth(self, root):
        if not root:
            return 0
        
        left_depth = self.maxDepth(root.left)
        right_depth = self.maxDepth(root.right)
        
        return 1 + max(left_depth, right_depth)

复杂度分析

  • 时间复杂度: O(n) - 每个节点恰好访问一次
  • 空间复杂度: O(h) - 递归栈深度等于树的高度(最坏情况 O(n) 对于倾斜树)

何时使用

  • 推荐 - 最直观和简洁的解决方案
  • 自然的递归结构匹配树结构
  • 易于理解和实现

关键洞察

树的最大深度是:

  • 如果树为空,则为 0
  • 否则为 1 + max(左子树深度, 右子树深度)

解法 2:迭代(使用 BFS)

工作原理

使用 BFS(层序遍历)来计数层数:

python 复制代码
from collections import deque

class Solution:
    def maxDepth(self, root):
        if not root:
            return 0
        
        queue = deque([root])
        depth = 0
        
        while queue:
            depth += 1
            level_size = len(queue)
            
            for _ in range(level_size):
                node = queue.popleft()
                
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
        
        return depth

复杂度分析

  • 时间复杂度: O(n) - 每个节点恰好访问一次
  • 空间复杂度: O(n) - 队列在最坏情况下可以容纳 n/2 个节点(完全树)

何时使用

  • 递归的替代方案
  • 避免非常深的树的潜在栈溢出
  • 需要逐层处理时有用

对比

方法 时间 空间 最佳适用
递归 O(n) O(h) 大多数情况,直观
迭代(BFS) O(n) O(n) 深度树,避免递归

总结

两种方法都实现了 O(n) 时间复杂度。递归解决方案通常因其简单性而更受欢迎。关键洞察是最大深度等于 1 加上左右子树的最大深度。

相关推荐
over6971 小时前
《闭包、RAG与AI面试官:一个前端程序员的奇幻LangChain之旅》
前端·面试·langchain
木头左2 小时前
机器学习辅助的LSTM交易策略特征工程与入参筛选技巧
python
Lenyiin2 小时前
《 Linux 修炼全景指南: 八 》别再碎片化学习!掌控 Linux 开发工具链:gcc、g++、GDB、Bash、Python 与工程化实践
linux·python·bash·gdb·gcc·g++·lenyiin
hetao17338372 小时前
2025-12-21~22 hetao1733837的刷题笔记
c++·笔记·算法
Swizard2 小时前
告别“意大利面条”:FastAPI 生产级架构的最佳实践指南
python·fastapi
不惑_2 小时前
通俗理解卷积神经网络
人工智能·windows·python·深度学习·机器学习
滴啦嘟啦哒2 小时前
【机械臂】【总览】基于VLA结构的指令驱动式机械臂
python·ros2·vla
醒过来摸鱼2 小时前
递归三种分类方法
算法
写代码的【黑咖啡】2 小时前
深入理解 Python 中的函数
开发语言·python