Skip to content

Binary Tree Level Order Traversal

Given the root of a binary tree, return the level order traversal of its nodes’ values (left to right, level by level).

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

Use a queue to traverse level by level, collecting nodes at each level into a list.

⏱ Time O(n) Visit all nodes 💾 Space O(w) Queue width
binary_tree_level_order_traversal_bfs.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 levelOrder(root: Optional[TreeNode]) -> List[List[int]]:
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
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(levelOrder(root)) # [[3], [9, 20], [15, 7]]
🎯 Interview Favourite

Use DFS and track level, building result lists on demand.

⏱ Time O(n) Visit all nodes 💾 Space O(h) Call stack
binary_tree_level_order_traversal_dfs.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 levelOrder(root: Optional[TreeNode]) -> List[List[int]]:
result = []
def dfs(node: Optional[TreeNode], level: int):
if not node: return
if level == len(result): result.append([])
result[level].append(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(levelOrder(root)) # [[3], [9, 20], [15, 7]]