LeetCode 104. 二叉树的最大深度
题目描述

题意分析
给定二叉树的根节点,返回它的最大深度。
定义要先咬准:最大深度是从根节点到最远叶子节点的最长路径上的节点数——按节点数计,不是按边数计。单个节点的树深度是
1而不是0,这是读题时最容易带偏的一点。约束上节点数在
0到10^4之间,也就是说root可能为null。边界情况:空树深度为0;只有根节点深度为1;树完全退化成一条链时,深度等于节点总数。
解法:递归计算左右子树深度
核心思路
定义
maxDepth(node)为以node为根的子树深度。空节点深度为0;非空节点的深度等于左右子树较大深度加上当前节点这一层。递推式:
maxDepth(node) = max(maxDepth(node.left), maxDepth(node.right)) + 1。
解题步骤
- 当前节点为空时返回
0。- 递归计算左右子树的最大深度。
- 取较大值并加
1,计入当前节点。
代码实现
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
}
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
leftDepth := maxDepth(root.Left)
rightDepth := maxDepth(root.Right)
if leftDepth > rightDepth {
return leftDepth + 1
}
return rightDepth + 1
}
复杂度分析
- 时间复杂度:$O(n)$,每个节点访问一次。
- 空间复杂度:$O(h)$,递归栈深度等于树高
h;树退化成链时最坏为 $O(n)$,完全平衡时为 $O(\log n)$。
关键点总结
- 递归函数返回当前子树的最大深度。
- 空节点返回
0,叶子节点自然得到1。- 左右子树都要计算,最长路径可能位于任意一侧。
易错点总结
- 忘记空节点判断会触发空指针错误。
- 返回值漏掉
+1,会少算当前节点这一层。- 只递归一侧会漏掉另一侧的更深路径。
- 最大深度按节点数计算,单节点树的深度是
1。
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 110. 平衡二叉树 | 简单 | 求高度的同时判断左右高度差 |
| 111. 二叉树的最小深度 | 简单 | 求最小值,空子树不能直接参与取 min
|
| 559. N 叉树的最大深度 | 简单 | 孩子从两个推广到列表遍历 |
| 剑指 Offer 55 - I. 二叉树的深度 | 简单 | 与本题同题的剑指版本 |
| 剑指 Offer 55 - II. 平衡二叉树 | 简单 | 自底向上返回高度并用哨兵值短路 |
| 面试题 04.04. 检查平衡性 | 简单 | 平衡判断的程序员面试金典版本 |