473 字
2 分钟
3月22日刷题笔记
本篇题目
#102二叉树的层序遍历
Medium
#617合并二叉树
Easy
一、理解递归的核心思想
不要试图在脑子里追踪每一层调用,只想当前节点该做什么,子树的事交给递归。
IMPORTANT递归三步法
- base case → 空节点返回什么?
- 当前层逻辑 → 这个节点做什么?
- 组合结果 → 用左右子树的结果拼出当前结果
万能模板:
def solve(root): if not root: # 1. base case return ...
do_something(root) # 2. 当前节点逻辑
left = solve(root.left) # 3. 交给递归 right = solve(root.right)
return combine(root, left, right)二、102. 二叉树的层序遍历(BFS)
#102二叉树的层序遍历
Medium
核心:用 deque,右边进左边出,每轮用 len(queue) 快照当前层节点数
from collections import deque
def levelOrder(root): if not root: return []
result = [] queue = deque([root]) # 初始化:根节点入队
while queue: level_size = len(queue) # 快照当前层节点数 level = []
for _ in range(level_size): # _ 表示不需要循环变量 node = queue.popleft() # O(1) 头部取出 level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right)
result.append(level)
return resultTIP为什么用
deque不用list?list.pop(0)是 O(n),因为要把后面所有元素往前移;deque.popleft()是 O(1),专门为队列设计。
三、617. 合并二叉树(递归典型题)
#617合并二叉树
Easy
思路:只想当前节点,两树都有就值相加,有一个为空就返回另一个
def mergeTrees(root1, root2): if not root1: return root2 # 一棵为空,返回另一棵 if not root2: return root1
node = TreeNode(root1.val + root2.val) # 当前节点相加 node.left = mergeTrees(root1.left, root2.left) # 交给递归 node.right = mergeTrees(root1.right, root2.right) return node四、常见语法速查
# deque 初始化queue = deque([root]) # 等价于 deque() + append(root)queue = deque([1, 2, 3]) # 用列表初始化多个元素
# _ 占位符:只想循环 N 次,不需要循环变量for _ in range(n): ...
# 判空写法(三种等价,推荐 is None 最精确)if not root: # 最简洁,常用if root is None: # 最精确,推荐if root == None: # 不推荐(可被 __eq__ 覆盖)