LeetCode 104. 二叉树的最大深度|递归思路超详细拆解

一、题目介绍

题目描述

给定一个二叉树 root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。

示例

示例 1:输入:root = [3,9,20,null,null,15,7]树结构:

plaintext

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

输出:3

示例 2:输入:root = [1,null,2]

plaintext

复制代码
1
 \
  2

输出:2

难度与标签

简单|二叉树、深度优先搜索、递归

二、解题思路:递归分治思想

核心逻辑

一棵二叉树的最大深度 = 1(当前根节点) + 左子树和右子树深度的最大值

  1. 递归终止条件 :当前节点为空(root = null),深度为 0,直接返回;
  2. 单层递归逻辑:分别递归求出左子树深度、右子树深度;
  3. 结果合并:取左右子树深度更大的值,加上当前节点 1 层,作为当前树深度返回。

举个例子对照示例 1 理解:

  • 叶子节点 9:左右都为空,max(0,0)+1 = 1
  • 叶子节点 15:max(0,0)+1 = 1,叶子 7 同理 = 1
  • 节点 20:max(1,1)+1 = 2
  • 根节点 3:max(1,2)+1 = 3,正好是答案

三、完整 JavaScript 代码

javascript

运行

ini 复制代码
/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
var maxDepth = function(root) {
    // 空节点深度为0,递归出口
    if (!root) return 0;
    // 递归计算左、右子树深度
    const left = maxDepth(root.left);
    const right = maxDepth(root.right);
    // 当前层1 + 左右子树最大深度
    return 1 + Math.max(left, right);
};

四、代码逐行解析

  1. if (!root) return 0;边界判断:如果当前遍历到空节点,说明这条分支走到尽头,深度计 0,结束本次递归。
  2. const left = maxDepth(root.left);递归遍历左孩子,拿到左子树完整深度。
  3. const right = maxDepth(root.right);递归遍历右孩子,拿到右子树完整深度。
  4. return 1 + Math.max(left, right);``Math.max(left, right) 选出更深的那条分支;+1 代表当前节点占一层,向上返回给上层递归。

五、复杂度分析

  • 时间复杂度 O (n) :n 为二叉树节点总数,每个节点只会被访问一次;

  • 空间复杂度 O (h) :h 是树的高度,递归调用栈深度等于树高。

    • 平衡二叉树:h = logn,空间 O (logn);
    • 单边倾斜树(如示例 2):h = n,空间 O (n)。

六、拓展:迭代层序遍历(BFS)解法

递归是 DFS 思路,这里补充广度优先层序遍历解法,适合不想用递归的场景:思路:逐层遍历,每遍历一层深度 + 1,直到队列为空。

javascript

运行

ini 复制代码
var maxDepth = function(root) {
    if (!root) return 0;
    let depth = 0;
    const queue = [root];
    while(queue.length) {
        // 当前层节点数量
        const size = queue.length;
        for(let i = 0; i < size; i++) {
            const node = queue.shift();
            if(node.left) queue.push(node.left);
            if(node.right) queue.push(node.right);
        }
        // 一层遍历完成,深度+1
        depth++;
    }
    return depth;
};

七、总结

  1. 二叉树递归核心:把整棵树拆解为根 + 左子树 + 右子树,分治求解;

  2. 递归三步法:确定出口条件、单层处理逻辑、合并左右结果;

  3. 两种解法对比:

    • DFS 递归:代码极简,书写最快,面试首选;
    • BFS 迭代:直观理解 "层数 = 深度",规避递归栈溢出问题。

这道题是二叉树递归入门经典题,吃透分治思想,后续二叉树直径、平衡二叉树、路径总和等题目都能复用这套递归模板。

相关推荐
kyriewen5 小时前
我用 AI 一周写完了整个项目,上线第一天就崩了——这是我踩过最贵的 5 个坑
前端·javascript·ai编程
Larcher5 小时前
AI Loop:让AI像人一样自主完成任务的核心机制
javascript·人工智能·设计模式
默_笙5 小时前
🃏 JS 只有 8 种数据类型,但我花了 2 天才搞懂 null 和 undefined 的区别
javascript
vivo互联网技术6 小时前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
jump_jump6 小时前
流式 HTML:从 htmx 片段装配到浏览器原生增量渲染
javascript·性能优化·前端工程化
Darling噜啦啦7 小时前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
swipe7 小时前
正则表达式入门到进阶:从表单校验到手写模板引擎
前端·javascript·面试
kyriewen8 小时前
前端错误监控最全指南:捕获 JS 异常、Promise 拒绝、资源加载失败,附上报代码
前端·javascript·监控