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) 在单支树上差很多,但不会栈溢出
  • 为什么广度/深度都能做? 最大深度只关心”最远”不关心”路径本身”,所以两种遍历都能算——“统计型”问题往往对遍历顺序不敏感

关联题