defdfs(node):
ifnot node:
return# base case# Pre-order: process node first
dfs(node.left)
# In-order: process node between children (BST sorted order)
dfs(node.right)
# Post-order: process node after children
Pattern 2 — BFS (Level Order)
from collections import deque
deflevel_order(root):
ifnot root:
return []
result, queue = [], deque([root])
while queue:
level = []
for _ inrange(len(queue)): # process entire level
node = queue.popleft()
level.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
result.append(level)
return result
Pattern 3 — Path Problems
# Max path sum through any nodedefmax_path_sum(root):
res = [root.val]
defdfs(node):
ifnot node: return0
left = max(dfs(node.left), 0) # ignore negative paths
right = max(dfs(node.right), 0)
res[0] = max(res[0], node.val + left + right) # update globalreturn node.val + max(left, right) # return single branch
dfs(root)
return res[0]