LeetCode Hot100(28/100)——104. 二叉树的最大深度

文章目录

一、题目理解

题目链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree

题目描述:

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

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


示例:

输入:

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

输出:

复制代码
3

解释:

根节点到叶子最深的路径是 3 → 20 → 153 → 20 → 7,深度为 3


二、问题分析

本题是一道经典的树形递归问题。二叉树每个节点都有左右子树,因此树的最大深度可由以下递推关系确定:

maxDepth(root) = 1 + max(maxDepth(root.left), maxDepth(root.right))

即:

  • 当前节点为空时深度为0;
  • 当前节点非空时,取左右子树的最大深度,再加上当前节点。

思维导图

二叉树最大深度
递归法
左右子树递归计算深度
深度为左右子树最大值+1
迭代法(BFS)
层序遍历统计层数
每层遍历完深度+1
DFS迭代法(栈)
模拟递归
每次入栈保存深度数据


三、解法一:递归法(最直接思路)

思路:

  1. 如果当前节点为空,返回深度 0
  2. 否则递归地计算左右子树的最大深度;
  3. 当前节点的深度等于 max(左子树深度, 右子树深度) + 1

递归流程图



开始
当前节点为空?
返回0
计算左子树深度
计算右子树深度
返回max(左,右)+1
结束


Java代码实现

java 复制代码
public class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return Math.max(left, right) + 1;
    }
}

复杂度分析

项目 分析
时间复杂度 O(n),每个节点都被访问一次
空间复杂度 O(h),其中 h 是树的高度(递归栈深度,最坏O(n))

四、解法二:迭代法(BFS层序遍历)

思路:

利用 队列(Queue) 实现 层序遍历(Breadth First Search)

  1. 从根节点开始,将其加入队列;
  2. 每次遍历一层中的所有节点;
  3. 每遍历完一层,就让深度加 1;
  4. 最后返回层数即为最大深度。

BFS遍历时序图

Result 深度计数 节点 队列 Result 深度计数 节点 队列 loop 每层节点 入队根节点 子节点入队 当前层结束,深度+1 输出最大深度


Java代码实现

java 复制代码
import java.util.*;

public class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int depth = 0;

        while (!queue.isEmpty()) {
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                if (node.left != null) queue.offer(node.left);
                if (node.right != null) queue.offer(node.right);
            }
            depth++; // 完成一层遍历深度+1
        }
        return depth;
    }
}

复杂度分析

项目 分析
时间复杂度 O(n),每个节点入队出队一次
空间复杂度 O(n),队列最多存满一层节点

五、解法三:DFS栈迭代法(深度优先遍历)

思路:

栈(Stack) 来模拟递归过程,每次入栈一个节点及其当前深度。

  1. 栈顶元素弹出时,更新最大深度;
  2. 如果有左或右节点,则入栈并深度+1;
  3. 遍历结束后,最大深度即结果。

DFS流程图







初始化栈,入栈(root, depth=1)
栈是否为空?
弹出栈顶节点
更新最大深度
是否有左孩子?
入栈(左节点, depth+1)
G
是否有右孩子?
入栈(右节点, depth+1)
J
返回最大深度


Java代码实现

java 复制代码
import java.util.*;

public class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) return 0;
        Stack<TreeNode> stack = new Stack<>();
        Stack<Integer> depthStack = new Stack<>();
        stack.push(root);
        depthStack.push(1);

        int maxDepth = 0;
        while (!stack.isEmpty()) {
            TreeNode node = stack.pop();
            int depth = depthStack.pop();
            maxDepth = Math.max(maxDepth, depth);
            if (node.left != null) {
                stack.push(node.left);
                depthStack.push(depth + 1);
            }
            if (node.right != null) {
                stack.push(node.right);
                depthStack.push(depth + 1);
            }
        }
        return maxDepth;
    }
}

复杂度分析

项目 分析
时间复杂度 O(n),每个节点访问一次
空间复杂度 O(n),栈最多存储节点路径

六、三种方法对比

解法 思路 使用结构 空间复杂度 难度 特点
递归法 分治计算左右深度 系统调用栈 O(h) 最简洁最直观
BFS法 按层统计节点层数 队列 O(n) ★★ 一层一层统计
DFS栈法 手动模拟递归过程 O(n) ★★★ 控制更灵活

七、总结

  • 最大深度 可看作树的高度问题,是树类面试必备题目之一;
  • 递归法 语义最清晰,是最推荐的写法;
  • 迭代法(BFS/DFS) 更偏向实战应用,可用于不允许递归的场景;
  • 掌握这题后,可以灵活应对如求最小深度、平衡二叉树、层序遍历等类似题目的扩展。
相关推荐
Bruce_Liuxiaowei39 分钟前
驴滑块拼图游戏:从19世纪的纸片谜题到数学博弈论
人工智能·算法
一直C44 分钟前
Linux系统编程|信号进阶 + SystemV IPC(消息队列、共享内存)
linux·c语言·开发语言·算法·青少年编程·vim
鹿角片ljp2 小时前
LeetCode 141. 环形链表|从 HashSet 到快慢指针 O (1) 空间最优解
算法·leetcode·链表
薛定e的猫咪2 小时前
(NeurIPS 2022)GraphGPS:MPNN 与全局注意力的融合之道
人工智能·深度学习·学习·算法
AI服务老曹3 小时前
车牌识别算法接入AI视频分析平台的流程和误报优化
人工智能·算法·音视频
神威难绷泪3 小时前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程
小星星闪亮登场3 小时前
图论--最小生成树(内含二分图)
数据结构·算法·图论·迭代加深·图搜索算法
ZC跨境爬虫4 小时前
LeetCode 219. 存在重复元素 II(滑动窗口 + 哈希表详解)
算法·leetcode·散列表
吞下星星的少年·-·4 小时前
The 2025 ICPC Asia East Continent Online Contest (I) A题(模拟+贪心)
算法·贪心·模拟
小程序设计4 小时前
【机械设计】磁粉检测机器人的设计与验证
算法·机器人