Skip to content

Binary Tree Zigzag Level Order Traversal

Given the root of a binary tree, return the zigzag level order traversal of its nodes’ values. (i.e., from left to right, then right to left for the next level and alternate between).

InputOutput
[3,9,20,null,null,15,7][[3],[20,9],[15,7]]
[1][[1]]
[][]
  • The number of nodes in the tree is in the range [0, 2000].
  • -1000 <= Node.val <= 1000
ApproachTimeSpace
BFS with DequeO(n)O(w)
DFS with Level ParityO(n)O(h)
★ Recommended

Use a deque. For even levels, add from left; for odd levels, add from right.

⏱ Time O(n) 💾 Space O(w)
binary_tree_zigzag_level_order_traversal_deque.py
from typing import Optional, List
from collections import deque
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def zigzagLevelOrder(root: Optional[TreeNode]) -> List[List[int]]:
if not root: return []
result = []
queue = deque([root])
level = 0
while queue:
sz = len(queue)
level_values = deque()
for _ in range(sz):
node = queue.popleft()
if level % 2 == 0:
level_values.append(node.val)
else:
level_values.appendleft(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
result.append(list(level_values))
level += 1
return result
if __name__ == "__main__":
root = TreeNode(3)
root.left, root.right = TreeNode(9), TreeNode(20)
root.right.left, root.right.right = TreeNode(15), TreeNode(7)
print(zigzagLevelOrder(root))
🎯 Interview Favourite

Use DFS and check level parity to determine insertion direction.

⏱ Time O(n) 💾 Space O(h)
binary_tree_zigzag_level_order_traversal_parity.py
from typing import Optional, List
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def zigzagLevelOrder(root: Optional[TreeNode]) -> List[List[int]]:
result = []
def dfs(node: Optional[TreeNode], level: int):
if not node: return
if level == len(result): result.append([])
if level % 2 == 0:
result[level].append(node.val)
else:
result[level].insert(0, node.val)
dfs(node.left, level + 1)
dfs(node.right, level + 1)
dfs(root, 0)
return result
if __name__ == "__main__":
root = TreeNode(3)
root.left, root.right = TreeNode(9), TreeNode(20)
root.right.left, root.right.right = TreeNode(15), TreeNode(7)
print(zigzagLevelOrder(root))