CHAPTER 06 · 递归核心

二叉树与递归

用遍历和分解问题两种视角理解递归,为搜索与动态规划打基础。

3 个知识小节8 道分层练习6–7 天 建议周期
展开本章目录
  1. 学习之前
  2. 1. 前中后序位置与遍历视角
  3. 2. 分解问题与后序返回值
  4. 3. 层序遍历与 BST 约束
  5. 延伸阅读
  6. 分层练习
  7. 我的笔记
00

BEFORE LEARNING

先理解为什么学

二叉树是理解递归最直观的载体。你需要同时掌握“遍历整棵树”和“让子树返回答案”两种思考方式。

开始前应具备

  • 理解递归调用栈
  • 知道终止条件
  • 熟悉队列的先进先出

完成本章后

  • 掌握前中后序遍历位置
  • 区分遍历思维和分解思维
  • 理解递归函数的定义与返回值
01

CORE LESSONS

知识讲义

01

LESSON

前中后序位置与遍历视角

什么时候想到它?

需要访问每个节点、维护从根到当前节点的路径状态,或在进入/离开节点时执行操作。

前序位置发生在进入节点时,中序位于左右子树之间,后序发生在左右子树都处理完后。所谓顺序,本质是代码相对递归调用的位置。

推导步骤

  1. 处理空节点终止条件
  2. 在前序位置处理进入动作
  3. 递归左右子树
  4. 在后序位置汇总或恢复状态
思维模板 / 伪代码
def traverse(node):
  if not node: return
  # 前序位置
  traverse(node.left)
  # 中序位置
  traverse(node.right)
  # 后序位置
02

LESSON

分解问题与后序返回值

什么时候想到它?

当前节点的答案可以由左右子树答案组合得到,如深度、直径、最近公共祖先。

把递归函数定义为“返回以当前节点为根的子树信息”。左右子树返回后,在后序位置组合结果,并决定向父节点返回什么。

推导步骤

  1. 一句话定义函数返回值
  2. 写出空树应返回的单位值
  3. 相信左右子树能返回正确结果
  4. 组合左右结果并更新全局或直接返回
思维模板 / 伪代码
def solve(node):
  if not node: return base
  left = solve(node.left)
  right = solve(node.right)
  update_answer(left, right)
  return combine(left, right)
03

LESSON

层序遍历与 BST 约束

什么时候想到它?

要求按层处理、最少层数,或题目利用二叉搜索树的全局有序性质。

BFS 按距离分层扩散;BST 则要求每个节点满足来自祖先的上下界,而不仅仅比较直接父子节点。

推导步骤

  1. BFS 在每层开始记录当前队列长度
  2. 入队时确定下一层节点
  3. BST 递归传递允许的下界和上界
  4. 利用中序结果严格递增进行验证
思维模板 / 伪代码
queue = [root]
while queue:
  size = len(queue)
  for _ in range(size):
    node = pop_front()
    push_children(node)
02

READING

延伸阅读

先读完本站讲义并尝试练习;遇到推导不清的地方,再回到原始教程深入阅读。

03

PRACTICE LADDER

按作用分层练习

题量由知识点决定,不再固定为 5 道。先完成“入门”和“模板”,再做变式与综合;挑战题可以留到复习阶段。

入门认识结构模板独立复现变式迁移条件综合组合技巧挑战延后突破
01

前中后序位置与遍历视角

2 道 · 依次完成

LC 144入门简单

二叉树的前序遍历

Binary Tree Preorder Traversal

为什么选:直接观察前序位置与访问顺序。

前序遍历建议 15 分钟
打开 LeetCode ↗
LC 226模板简单

翻转二叉树

Invert Binary Tree

为什么选:比较前序和后序交换子树的不同写法。

前序 / 后序建议 25 分钟
打开 LeetCode ↗
02

分解问题与后序返回值

3 道 · 依次完成

LC 104入门简单

二叉树的最大深度

Maximum Depth

为什么选:用一句递归定义描述子树最大深度。

递归定义建议 20 分钟
打开 LeetCode ↗
LC 543变式简单

二叉树的直径

Diameter of Binary Tree

为什么选:区分向上返回的深度和全局记录的直径。

后序返回值建议 35 分钟
打开 LeetCode ↗
LC 236挑战中等

二叉树的最近公共祖先

Lowest Common Ancestor

为什么选:让子树返回目标节点或公共祖先。

后序位置建议 45 分钟
打开 LeetCode ↗
03

层序遍历与 BST 约束

3 道 · 依次完成

LC 102模板中等

二叉树的层序遍历

Level Order Traversal

为什么选:按当前队列长度划分层级。

BFS建议 30 分钟
打开 LeetCode ↗
LC 98综合中等

验证二叉搜索树

Validate BST

为什么选:训练祖先上下界而非局部父子比较。

上下界建议 35 分钟
打开 LeetCode ↗
LC 230变式中等

二叉搜索树中第 K 小的元素

Kth Smallest in a BST

为什么选:利用 BST 中序严格递增定位第 K 个节点。

BST 中序建议 30 分钟
打开 LeetCode ↗
04

PERSONAL NOTEBOOK

我的学习笔记

我如何识别这个模式?今天卡在哪里?下次需要先检查什么?

笔记保存在当前浏览器