BFS (Breadth-First Search)
Use when: Shortest path in unweighted graph, level-order traversal, “minimum steps” problems.
Complexity: O(V + E)
Standard BFS
from collections import deque
def bfs(graph, start):
visited = set([start])
queue = deque([start])
while queue:
node = queue.popleft()
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append(neighbor)BFS - Shortest Path (unweighted)
from collections import deque
def bfs_shortest(graph, start, target):
visited = set([start])
queue = deque([(start, 0)]) # (node, distance)
while queue:
node, dist = queue.popleft()
if node == target:
return dist
for neighbor in graph[node]:
if neighbor not in visited:
visited.add(neighbor)
queue.append((neighbor, dist + 1))
return -1 # unreachableBFS - Level Order (trees)
from collections import deque
def level_order(root):
if not root:
return []
queue = deque([root])
result = []
while queue:
level = []
for _ in range(len(queue)): # process one level at a time
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 resultBFS - Grid
from collections import deque
def bfs_grid(grid, start):
rows, cols = len(grid), len(grid[0])
visited = set([start])
queue = deque([start])
dirs = [(0,1),(0,-1),(1,0),(-1,0)]
while queue:
r, c = queue.popleft()
for dr, dc in dirs:
nr, nc = r + dr, c + dc
if 0 <= nr < rows and 0 <= nc < cols and (nr, nc) not in visited:
visited.add((nr, nc))
queue.append((nr, nc))Signals in a Problem
- “Minimum number of steps/moves”
- “Shortest path” in unweighted graph or grid
- Level-by-level processing