defbfs(root): ifnot root: return [] q = deque() q.append(root) result = [] while q: level_size = len(q) # 这一层有几个 level = [] for _ inrange(level_size): node = q.popleft() level.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) result.append(level) return result
BFS 求最短路
找最短路用 BFS,因为 BFS 一层一层扩展,第一次到达就是最短
defshortestPath(grid): m, n = len(grid), len(grid[0]) q = deque([(0, 0, 1)]) # (row, col, distance) visited = {(0, 0)} while q: r, c, dist = q.popleft() if r == m - 1and c == n - 1: return dist for dr, dc in [(0,1), (0,-1), (1,0), (-1,0)]: nr, nc = r + dr, c + dc if0 <= nr < m and0 <= nc < n and grid[nr][nc] == 0and (nr, nc) notin visited: visited.add((nr, nc)) q.append((nr, nc, dist + 1)) return -1
Grid 版 DFS
defdfs(grid, row, col): m, n = len(grid), len(grid[0]) if row < 0or row >= m or col < 0or col >= n or grid[row][col] != '1': return grid[row][col] = '0'# 标记为已访问 dfs(grid, row + 1, col) dfs(grid, row - 1, col) dfs(grid, row, col + 1) dfs(grid, row, col - 1)
Grid 版 BFS
from collections import deque
defbfs(grid, start_row, start_col): m, n = len(grid), len(grid[0]) q = deque([(start_row, start_col)]) visited = {(start_row, start_col)} while q: row, col = q.popleft() for dr, dc in [(0,1), (0,-1), (1,0), (-1,0)]: nr, nc = row + dr, col + dc if0 <= nr < m and0 <= nc < n and (nr, nc) notin visited: visited.add((nr, nc)) q.append((nr, nc))
BFS + 入度(拓扑排序)
from collections import defaultdict, deque
defcanFinish(numCourses, prerequisites): graph = defaultdict(list) indegree = [0] * numCourses # 建图 for a, b in prerequisites: graph[b].append(a) indegree[a] += 1 # 入度为 0 的节点入队 q = deque([i for i inrange(numCourses) if indegree[i] == 0]) count = 0 while q: node = q.popleft() count += 1 for neighbor in graph[node]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: q.append(neighbor) return count == numCourses
DFS + 环检测(三色标记法)
from collections import defaultdict
defcanFinish(numCourses, prerequisites): graph = defaultdict(list) for a, b in prerequisites: graph[b].append(a) # 0=未访问, 1=正在访问, 2=已完成 state = [0] * numCourses defhasCycle(node): if state[node] == 1: # 正在访问,说明有环 returnTrue if state[node] == 2: # 已完成,无环 returnFalse state[node] = 1# 标记为正在访问 for neighbor in graph[node]: if hasCycle(neighbor): returnTrue state[node] = 2# 标记为已完成 returnFalse for i inrange(numCourses): if hasCycle(i): returnFalse returnTrue