Classic Queue Problems
1. Binary Tree Level Order Traversal
Problem: Return the level-order traversal of a binary tree.
from collections import deque
def level_order(root):
if not root:
return []
result = []
queue = deque([root])
while queue:
level_size = len(queue)
level = []
for _ in range(level_size):
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
Key Pattern: Use queue size to process one level at a time.
2. Number of Islands (BFS Approach)
Problem: Count the number of islands in a 2D grid.
from collections import deque
def num_islands(grid):
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
islands = 0
def bfs(r, c):
queue = deque([(r, c)])
grid[r][c] = '0' # Mark as visited
while queue:
row, col = queue.popleft()
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
for dr, dc in directions:
nr, nc = row + dr, col + dc
if (0 <= nr < rows and 0 <= nc < cols and
grid[nr][nc] == '1'):
grid[nr][nc] = '0'
queue.append((nr, nc))
for r in range(rows):
for c in range(cols):
if grid[r][c] == '1':
bfs(r, c)
islands += 1
return islands
3. Sliding Window Maximum
Problem: Find the maximum in each sliding window of size k.
from collections import deque
def max_sliding_window(nums, k):
if not nums or k == 0:
return []
result = []
dq = deque() # Store indices
for i in range(len(nums)):
# Remove indices outside current window
while dq and dq[0] < i - k + 1:
dq.popleft()
# Remove smaller elements (not useful)
while dq and nums[dq[-1]] < nums[i]:
dq.pop()
dq.append(i)
# Add to result after first window
if i >= k - 1:
result.append(nums[dq[0]])
return result
# Example
nums = [1, 3, -1, -3, 5, 3, 6, 7]
k = 3
print(max_sliding_window(nums, k))
# [3, 3, 5, 5, 6, 7]
Key Pattern: Monotonic deque to maintain maximum in sliding window.
4. Design Circular Queue
Problem: Implement a circular queue with fixed capacity.
class MyCircularQueue:
def __init__(self, k: int):
self.queue = [0] * k
self.max_size = k
self.head = 0
self.tail = -1
self.size = 0
def enQueue(self, value: int) -> bool:
if self.isFull():
return False
self.tail = (self.tail + 1) % self.max_size
self.queue[self.tail] = value
self.size += 1
return True
def deQueue(self) -> bool:
if self.isEmpty():
return False
self.head = (self.head + 1) % self.max_size
self.size -= 1
return True
def Front(self) -> int:
return -1 if self.isEmpty() else self.queue[self.head]
def Rear(self) -> int:
return -1 if self.isEmpty() else self.queue[self.tail]
def isEmpty(self) -> bool:
return self.size == 0
def isFull(self) -> bool:
return self.size == self.max_size
5. Rotting Oranges
Problem: Find minimum time for all oranges to rot (multi-source BFS).
from collections import deque
def oranges_rotting(grid):
rows, cols = len(grid), len(grid[0])
queue = deque()
fresh = 0
# Find all rotten oranges and count fresh
for r in range(rows):
for c in range(cols):
if grid[r][c] == 2:
queue.append((r, c, 0)) # (row, col, time)
elif grid[r][c] == 1:
fresh += 1
if fresh == 0:
return 0
minutes = 0
directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
while queue:
r, c, time = queue.popleft()
minutes = max(minutes, time)
for dr, dc in directions:
nr, nc = r + dr, c + dc
if (0 <= nr < rows and 0 <= nc < cols and
grid[nr][nc] == 1):
grid[nr][nc] = 2
fresh -= 1
queue.append((nr, nc, time + 1))
return minutes if fresh == 0 else -1
6. Implement Stack Using Queues
Problem: Implement a stack using only queue operations.
from collections import deque
class MyStack:
def __init__(self):
self.q = deque()
def push(self, x: int) -> None:
self.q.append(x)
# Rotate queue so new element is at front
for _ in range(len(self.q) - 1):
self.q.append(self.q.popleft())
def pop(self) -> int:
return self.q.popleft()
def top(self) -> int:
return self.q[0]
def empty(self) -> bool:
return len(self.q) == 0
Common Queue Problem Patterns
- Level-by-level Processing: BFS, tree level traversal
- Multi-source BFS: Rotting oranges, 01 matrix
- Sliding Window: Maximum/minimum in window
- Task Scheduling: CPU scheduling, task priority
- Data Stream: Moving average, recent requests