Skip to content

Commit 3a41333

Browse files
Add 'Binary Tree Level Order Traversal'
1 parent 84ac99f commit 3a41333

File tree

3 files changed

+105
-0
lines changed

3 files changed

+105
-0
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ A collection of LeetCode solutions
88

99
[Binary Search](./src/binary_search.py)
1010

11+
[Binary Tree Level Order Traversal](./src/binary_tree_level_order_traversal.py)
12+
1113
[Climbing Stairs](./src/climbing_stairs.py)
1214

1315
[Coin Change](./src/coin_change.py)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"""
2+
102. Binary Tree Level Order Traversal
3+
4+
https://leetcode.com/problems/binary-tree-level-order-traversal
5+
6+
NOTES
7+
* Use depth-first or breadth-first search. The strategy for keeping track of
8+
the current level is slightly different for each approach. For depth-first
9+
search, pass the level with the recursive call. For breadth-first search,
10+
dequeue the entire level all at once, add the nodes to the result, then
11+
enqueue all child nodes.
12+
"""
13+
14+
from collections import deque
15+
16+
from src.classes import TreeNode
17+
18+
19+
class Solution:
20+
def levelOrder(self, root: TreeNode | None) -> list[list[int]]:
21+
if not root:
22+
return []
23+
24+
levels: list[list[int]] = []
25+
queue: deque[TreeNode] = deque([root])
26+
level = 0
27+
28+
while queue:
29+
levels.append([])
30+
# Loop invariant: The length of the queue is the width of the
31+
# level.
32+
for _ in range(len(queue)):
33+
curr = queue.popleft()
34+
levels[level].append(curr.val)
35+
if curr.left:
36+
queue.append(curr.left)
37+
if curr.right:
38+
queue.append(curr.right)
39+
level += 1
40+
41+
return levels
42+
43+
44+
class SolutionDFS:
45+
def levelOrder(self, root: TreeNode | None) -> list[list[int]]:
46+
if not root:
47+
return []
48+
levels: list[list[int]] = []
49+
self._levelOrder(root, 0, levels)
50+
return levels
51+
52+
def _levelOrder(self, root: TreeNode | None, level: int, levels: list[list[int]]) -> None:
53+
if not root:
54+
return
55+
if len(levels) < level + 1:
56+
levels.append([])
57+
levels[level].append(root.val)
58+
self._levelOrder(root.left, level + 1, levels)
59+
self._levelOrder(root.right, level + 1, levels)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"""
2+
102. Binary Tree Level Order Traversal
3+
4+
https://leetcode.com/problems/binary-tree-level-order-traversal
5+
"""
6+
7+
from unittest import TestCase
8+
9+
from src.binary_tree_level_order_traversal import Solution, SolutionDFS
10+
from tests.utils import create_binary_tree_from_list
11+
12+
13+
class TestSolution(TestCase):
14+
def test_1(self):
15+
exp = [[3], [9, 20], [15, 7]]
16+
root = create_binary_tree_from_list([3, 9, 20, None, None, 15, 7])
17+
assert Solution().levelOrder(root) == exp
18+
19+
def test_2(self):
20+
exp = [[1]]
21+
root = create_binary_tree_from_list([1])
22+
assert Solution().levelOrder(root) == exp
23+
24+
def test_3(self):
25+
exp = []
26+
root = create_binary_tree_from_list([])
27+
assert Solution().levelOrder(root) == exp
28+
29+
30+
class TestSolutionDFS(TestCase):
31+
def test_1(self):
32+
exp = [[3], [9, 20], [15, 7]]
33+
root = create_binary_tree_from_list([3, 9, 20, None, None, 15, 7])
34+
assert SolutionDFS().levelOrder(root) == exp
35+
36+
def test_2(self):
37+
exp = [[1]]
38+
root = create_binary_tree_from_list([1])
39+
assert SolutionDFS().levelOrder(root) == exp
40+
41+
def test_3(self):
42+
exp = []
43+
root = create_binary_tree_from_list([])
44+
assert SolutionDFS().levelOrder(root) == exp

0 commit comments

Comments
 (0)