Level-order traversal patterns: standard, zigzag, right view, and connecting next pointers
Use a queue to process nodes by levels and track boundaries to derive level-based properties.
Use when output depends on levels, sibling connections, or views from one side.
Collect nodes level by level
from collections import deque
def level_order(root):
if not root: return []
res, q = [], deque([root])
while q:
size = len(q); level = []
for _ in range(size):
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
Alternate direction per level
from collections import deque
def zigzag_level_order(root):
if not root: return []
res, q, ltr = [], deque([root]), True
while q:
size = len(q); level = deque()
for _ in range(size):
node = q.popleft()
(level.append if ltr else level.appendleft)(node.val)
if node.left: q.append(node.left)
if node.right: q.append(node.right)
res.append(list(level)); ltr = not ltr
return res
Track last node per level
from collections import deque
def right_side_view(root):
if not root: return []
res, q = [], deque([root])
while q:
size = len(q)
for i in range(size):
node = q.popleft()
if node.left: q.append(node.left)
if node.right: q.append(node.right)
if i == size - 1: res.append(node.val)
return res
Link siblings using level BFS
from collections import deque
def connect_next(root):
if not root: return root
q = deque([root])
while q:
prev = None
for _ in range(len(q)):
node = q.popleft()
if prev: prev.next = node
prev = node
if node.left: q.append(node.left)
if node.right: q.append(node.right)
prev.next = None
return root
def template(*args, **kwargs):
# General template placeholder
pass
Each node visited once.
Queue holds up to width w of a level.