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

相关推荐
老毛肚6 小时前
jeecg-boot-base-core 02 day
javascript·python
yaoxin5211236 小时前
434. Java 日期时间 API - Period 基于日期的时间段
java·开发语言·python
noipp7 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
kyriewen7 小时前
Git Commit 前自动修复代码风格?配置 Husky + lint-staged,从此 CR 只聊逻辑
前端·git·面试
岁月宁静7 小时前
RAG 文档摄入全链路,从原理到生产落地
vue.js·人工智能·python
程序员二叉7 小时前
【JUC】ThreadLocal底层原理|内存泄漏|弱引用|跨线程传递方案
java·开发语言·面试·职场和发展·juc
程序员二叉7 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
JaydenAI7 小时前
[对比学习LangChain和MAF-07]如何引入人机交互的审批流程
python·ai·langchain·c#·agent·hitl·maf
青山木8 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕8 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github