First In, First Out. Essential for BFS. Always use deque, never list.pop(0) which is O(n).
| Operation | list | collections.deque |
|---|---|---|
| Add to back | O(1) | O(1) |
| Remove from front | O(n) — shifts all! | O(1) ✓ |
| Add to front | O(n) | O(1) |
| Remove from back | O(1) | O(1) |
queue.pop(0) — shifts all n elements left. Always use from collections import deque and deque.popleft().BFS explores level by level using a queue. Each node is processed before its children are explored.
[]from collections import deque q = deque() q.append(x) # enqueue back — O(1) q.popleft() # dequeue front — O(1) q.appendleft(x) # add front — O(1) q.pop() # remove back — O(1) q[0] # peek front — O(1) q[-1] # peek back — O(1) not q # True if empty # BFS template (graph) def bfs(graph, start): visited = {start} q = deque([start]) while q: node = q.popleft() # process node for nei in graph[node]: if nei not in visited: visited.add(nei) # mark BEFORE enqueue q.append(nei)
def level_order(root): if not root: return [] q, res = deque([root]), [] while q: level = [] for _ in range(len(q)): # process one level node = q.popleft() level.append(node.val) if node.left: q.append(node.left) if node.right: q.append(node.right) res.append(level) return res