开始前应具备
- 理解递归调用栈
- 知道终止条件
- 熟悉队列的先进先出
CHAPTER 06 · 递归核心
用遍历和分解问题两种视角理解递归,为搜索与动态规划打基础。
BEFORE LEARNING
二叉树是理解递归最直观的载体。你需要同时掌握“遍历整棵树”和“让子树返回答案”两种思考方式。
开始前应具备
完成本章后
CORE LESSONS
LESSON
需要访问每个节点、维护从根到当前节点的路径状态,或在进入/离开节点时执行操作。
前序位置发生在进入节点时,中序位于左右子树之间,后序发生在左右子树都处理完后。所谓顺序,本质是代码相对递归调用的位置。
def traverse(node):
if not node: return
# 前序位置
traverse(node.left)
# 中序位置
traverse(node.right)
# 后序位置LESSON
当前节点的答案可以由左右子树答案组合得到,如深度、直径、最近公共祖先。
把递归函数定义为“返回以当前节点为根的子树信息”。左右子树返回后,在后序位置组合结果,并决定向父节点返回什么。
def solve(node):
if not node: return base
left = solve(node.left)
right = solve(node.right)
update_answer(left, right)
return combine(left, right)LESSON
要求按层处理、最少层数,或题目利用二叉搜索树的全局有序性质。
BFS 按距离分层扩散;BST 则要求每个节点满足来自祖先的上下界,而不仅仅比较直接父子节点。
queue = [root]
while queue:
size = len(queue)
for _ in range(size):
node = pop_front()
push_children(node)READING
先读完本站讲义并尝试练习;遇到推导不清的地方,再回到原始教程深入阅读。
PRACTICE LADDER
题量由知识点决定,不再固定为 5 道。先完成“入门”和“模板”,再做变式与综合;挑战题可以留到复习阶段。
2 道 · 依次完成
Binary Tree Preorder Traversal
为什么选:直接观察前序位置与访问顺序。
Invert Binary Tree
为什么选:比较前序和后序交换子树的不同写法。
3 道 · 依次完成
Maximum Depth
为什么选:用一句递归定义描述子树最大深度。
Diameter of Binary Tree
为什么选:区分向上返回的深度和全局记录的直径。
Lowest Common Ancestor
为什么选:让子树返回目标节点或公共祖先。
3 道 · 依次完成
Level Order Traversal
为什么选:按当前队列长度划分层级。
Validate BST
为什么选:训练祖先上下界而非局部父子比较。
Kth Smallest in a BST
为什么选:利用 BST 中序严格递增定位第 K 个节点。
PERSONAL NOTEBOOK
笔记保存在当前浏览器