We use BFS (Level Order Traversal) with a slight modification: we use a boolean flag left_to_right and reverse the level's values whenever the flag is false.
- If
rootis None, return []. - Initialize
queuewithrootandleft_to_right = True. - While queue is not empty:
- Get
sizeof current level. - Collect
level_vals. - If
not left_to_right, reverselevel_vals. - Append to result.
- Toggle
left_to_right.
- Get
- Return
result.
- Time Complexity: O(N).
- Space Complexity: O(W).
from collections import deque
def zigzag_level_order(root):
if not root:
return []
res = []
q = deque([root])
left_to_right = True
while q:
level = []
for _ in range(len(q)):
node = q.popleft()
level.append(node.val)
if node.left: q.append(node.left)
if node.right: q.append(node.right)
if not left_to_right:
level.reverse()
res.append(level)
left_to_right = not left_to_right
return res