图解题库 / 二叉树 · 递归

104. 二叉树的最大深度

简单 含交互动画

学完这道你应该能: 说清它为什么用「递归」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

求二叉树的最大深度(从根到最远叶子的节点数)。

= 3 →(9, 20),20 →(15, 7)
输出 = 3

思路解析

把大问题拆成子问题:要算整棵树的深度,先算左、右子树各自的深度,取较大的 + 1(算上根这一层)。空树深度为 0——这是递归的底。

叶子深度 = 1:从最底层算起:叶子 9、15、7 都没有孩子,各自深度 = 1。这是递归触底返回的起点。

节点 20 · 1+max(1,1)=2:节点 20 的左右孩子(15、7)深度都是 1,所以 depth(20) = 1 + max(1,1) = 2。

节点 9 · 深度 1:左边的 9 是叶子,深度 1。现在根的两个孩子深度分别是 9→1、20→2。

根 3 · 1+max(1,2)=3:根 3:depth = 1 + max(depth(9)=1, depth(20)=2) = 1 + 2 = 3。这就是答案。

「先递归拿到左右子树的答案,再合并成当前节点的答案」是树形问题的万能套路(后序/树形DP):深度、直径、平衡判断、最大路径和全靠它。

参考代码(Python)

Python
1def maxDepth(self, root):
2    if not root: return 0              # 空树深度 0
3    left = self.maxDepth(root.left)    # 左子树深度
4    right = self.maxDepth(root.right)  # 右子树深度
5    return 1 + max(left, right)        # 取大 + 自己这层

复杂度分析

  • 时间复杂度:O(n) —— 每个节点算一次
  • 空间复杂度:O(h) —— 递归栈 = 树高

套路模板

记住骨架:空返回基准、递归拿左右答案、合并成当前答案。换"合并"的公式就解不同题:深度用 1+max、节点数用 1+L+R。

Python
1def dfs(node):
2    if not node: return 基准值       # 空节点的答案
3    L = dfs(node.left)              # 左子树的答案
4    R = dfs(node.right)            # 右子树的答案
5    return 合并(L, R, node)         # 拼成当前节点的答案

易错点

  • 空树返回 1 → ✅ 空树返回 0(空树没有节点,深度是 0,叶子才是 1)
  • 只算一条路径 → ✅ 取左右子树的 max(深度看最长那条路)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →226. 翻转二叉树 ← 返回题库