题目描述
求二叉树的最大深度(从根到最远叶子的节点数)。
树 = 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(深度看最长那条路)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。