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 迭代:直观理解 "层数 = 深度",规避递归栈溢出问题。

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

相关推荐
c2385621 分钟前
《枚举算法 “翻译官”:用 enum class 给 “游游的礼盒” 算分》
c语言·c++·算法
noipp28 分钟前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
极客BIM工作室31 分钟前
OpenCascade 倒角(Chamfer)算法完整逻辑解析
算法
海带紫菜菠萝汤43 分钟前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm
冻柠檬飞冰走茶44 分钟前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
鱼子星_1 小时前
《算 · 法》题目解析篇(1):最近公共祖先问题,线段树,最长回文子序列
c++·算法·动态规划·递归
雾喔1 小时前
算法练习5
算法·代理模式
名字还没想好☜1 小时前
React 受控输入框光标跳到末尾:格式化输入时的 selection 丢失 bug 与修复
前端·javascript·react.js·bug·react·next.js
问商十三载1 小时前
RAG 检索召回越多越好?2026 信噪比模型深度解析
人工智能·算法·机器学习
额恩661 小时前
ResearchPilot 第三阶段总结报告
python·算法