104. 二叉树的最大深度(Maximum Depth of Binary Tree)
频次 ★★★★ · 难度 🟢 · 高频:全厂
题目
求二叉树根到最远叶子节点的路径上的节点数(即深度)。
示例:
输入: [3,9,20,null,null,15,7]
输出: 3
思路
递归(DFS):最大深度 = 1 + max(左子树深度,右子树深度),空节点返回 0。
一句话代码,面试中最常写的递归签名题。
代码
public int maxDepth(TreeNode root) {
if (root == null) return 0;
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}复杂度
- 时间:O(n) —— 每个节点访问一次
- 空间:O(height) —— 最坏 O(n)(单支树退化),平均 O(log n)
边界条件
- 空树:返回 0
- 单节点:
1 + max(0,0) = 1 - 单支树:每个节点只有一侧子树,深度 = 节点数
变式
- 110. 平衡二叉树:在求深度过程中判断左右子树深度差是否 > 1,是则提前返回 -1
- N 叉树最大深度:
1 + max(所有子节点深度) - 层序遍历版:用 BFS 数层数,适合非递归要求
易错点
- 深度 vs 高度容易混淆:深度是从根到节点的边数(或节点数),本题按节点数算(根深度 1)
- 递归深度不能太深——极端单支树递归栈可能溢出(树高 > 10000 时考虑迭代栈或 BFS)
面试追问
- 用 BFS 怎么写? 队列层序遍历,每处理一层 depth++。面试中对比:BFS 空间 O(n) 比 DFS O(height) 在单支树上差很多,但不会栈溢出
- 为什么广度/深度都能做? 最大深度只关心”最远”不关心”路径本身”,所以两种遍历都能算——“统计型”问题往往对遍历顺序不敏感
关联题
- 同套路:110. 平衡二叉树 —— 扩展自本题的递归判平衡
- 进阶:543. 二叉树的直径 —— 深度求和而非取最大
- 知识点:树递归的”分治”模式(左 + 右 + 合并)见二叉树