# Binary Tree: Order Level Traversal
```python=
from typing import List
from utilities import TreeNode, listToBinaryTree
"""
Given the root of a binary tree, return the level order traversal of its nodes' values. (i.e., from left to right, level by level).
Example:
3
/ \
9 20
/ \
15 7
Returns:
[[3], [9, 20], [15, 7]]
Example:
3
/ \
9 20
/ / \
10 15 7
Returns:
[[3], [9, 20], [10, 15, 7]]
Example:
3
\
4
\
5
\
6
\
7
Returns:
[[3], [4], [5], [6], [7]]
"""
"""
Understand:
For each level of the binary tree, append them to a list left to right.
Match:
Definitely a Binary Tree Problem
-> Maybe Breadth-First Search could be useful?
Plan:
Initialize a list of lists
For each "level" of the Binary Tree, iterate through each node and add their value to a list
Append that list to our list of lists
Return the list of lists
Implement:
I think we're done?
Review:
Added some more test cases, feeling pretty good
Evaluate:
Time Complexity
O(n)
Space Complexity
O(n) where n is the number of nodes in the tree
"""
# Solution 1: BFS Recursion
def orderLevelTraversal1(root: TreeNode) -> List[List[int]]:
levels = []
appendLevelValues(nodes=[root], levels=levels)
return levels
def appendLevelValues(nodes: List[TreeNode], levels: List[List[int]]):
curLevelValues = []
nextLevelNodes = []
if not nodes:
return
for node in nodes:
curLevelValues.append(node.val)
if node.left:
nextLevelNodes.append(node.left)
if node.right:
nextLevelNodes.append(node.right)
levels.append(curLevelValues)
appendLevelValues(nextLevelNodes, levels)
# Solution 2: BFS Iterative
def orderLevelTraversal2(root: TreeNode) -> List[List[int]]:
levels = []
nodes = [root]
while nodes:
# Append to levels list and generate next level of nodes
curLevelValues = []
nextLevelNodes = []
for node in nodes:
curLevelValues.append(node.val)
if node.left:
nextLevelNodes.append(node.left)
if node.right:
nextLevelNodes.append(node.right)
levels.append(curLevelValues)
nodes = nextLevelNodes
return levels
# Solution 3: DFS Recursive
def orderLevelTraversal3(root: TreeNode) -> List[List[int]]:
levels = []
dfs(root, 0, levels)
return levels
def dfs(root: TreeNode, curLevel: int, levels: List[List[int]]) -> None:
if root:
if curLevel >= len(levels):
levels.append([])
levels[curLevel].append(root.val)
dfs(root.left, curLevel + 1, levels)
dfs(root.right, curLevel + 1, levels)
# Solution 4 (left to the reader): DFS iterative
def runTests() -> None:
test_cases = [
# 3
# / \
# 9 20
# / \
# 15 7
{
"input": listToBinaryTree([3, 9, 20, None, None, 15, 7]),
"expectedOutput": [[3], [9, 20], [15, 7]],
},
# 3
# / \
# 9 20
# / / \
# 10 15 7
{
"input": listToBinaryTree([3, 9, 20, 10, None, 15, 7]),
"expectedOutput": [[3], [9, 20], [10, 15, 7]],
},
# 3
# \
# 4
# \
# 5
# \
# 6
# \
# 7
{
"input": listToBinaryTree([3, None, 4, None, 5, None, 6, None, 7]),
"expectedOutput": [[3], [4], [5], [6], [7]],
},
]
for case in test_cases:
actual = orderLevelTraversal3(case["input"])
expected = case["expectedOutput"]
if actual == expected:
print("Test success!")
else:
print(
f"""Test failed - {case["input"]} returned {actual}, but expected {expected}"""
)
if __name__ == "__main__":
runTests()
```