力扣(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 加上左右子树的最大深度。

相关推荐
2501_944934736 小时前
高职大数据技术专业,CDA和Python认证优先考哪个?
大数据·开发语言·python
helloworldandy6 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
DuHz6 小时前
超宽带脉冲无线电(Ultra Wideband Impulse Radio, UWB)简介
论文阅读·算法·汽车·信息与通信·信号处理
发现一只大呆瓜7 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
Polaris北极星少女7 小时前
TRSV优化2
算法
代码游侠8 小时前
C语言核心概念复习——网络协议与TCP/IP
linux·运维·服务器·网络·算法
2301_763472468 小时前
C++20概念(Concepts)入门指南
开发语言·c++·算法
肖永威8 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
TechWJ8 小时前
PyPTO编程范式深度解读:让NPU开发像写Python一样简单
开发语言·python·cann·pypto
枷锁—sha8 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全