Skip to content

Commit a575cb0

Browse files
committed
Inorder, Preorder and postorder iterations
1 parent 85f5f35 commit a575cb0

File tree

2 files changed

+158
-3
lines changed

2 files changed

+158
-3
lines changed

173.binary_search_tree_iterator/iterator.py

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Optional
1+
from typing import List, Optional
22

33
class BSTIterator:
44
def __init__(self, root: Optional[TreeNode]):
@@ -21,7 +21,50 @@ def hasNext(self) -> bool:
2121
return len(self.stack) > 0
2222

2323
class TreeNode:
24-
def __init__(self, val:0, left: None, right: None):
24+
def __init__(self, val=0, left=None, right=None):
2525
self.val = val
2626
self.left = left
27-
self.right = right
27+
self.right = right
28+
29+
def inorder(self) -> List[int]:
30+
cur = self
31+
stack = []
32+
result = []
33+
while cur or stack:
34+
if cur:
35+
stack.append(cur)
36+
cur = cur.left
37+
else:
38+
pop = stack.pop()
39+
result.append(pop.val)
40+
cur = pop.right
41+
return result
42+
43+
def preorder(self) -> List[int]:
44+
cur = self
45+
stack = []
46+
result = []
47+
while cur or stack:
48+
if cur:
49+
result.append(cur.val)
50+
stack.append(cur)
51+
cur = cur.left
52+
else:
53+
pop = stack.pop()
54+
cur = pop.right
55+
return result
56+
57+
def postorder(self) -> List[int]:
58+
stack = []
59+
stack.append((self, False))
60+
result = []
61+
while stack:
62+
cur = stack.pop()
63+
if cur[0]:
64+
if cur[1]:
65+
result.append(cur[0].val)
66+
else:
67+
stack.append((cur[0], True))
68+
stack.append((cur[0].right, False))
69+
stack.append((cur[0].left, False))
70+
return result

173.binary_search_tree_iterator/test_iterator.py

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,118 @@
22
from iterator import TreeNode
33
from iterator import BSTIterator
44

5+
6+
class TestTreeNodePostorder(unittest.TestCase):
7+
def test_single_node(self):
8+
root = TreeNode(1)
9+
self.assertEqual(root.postorder(), [1])
10+
11+
def test_left_skewed(self):
12+
# 3
13+
# /
14+
# 2
15+
#/
16+
#1
17+
root = TreeNode(3, TreeNode(2, TreeNode(1)))
18+
self.assertEqual(root.postorder(), [1, 2, 3])
19+
20+
def test_right_skewed(self):
21+
# 1
22+
# \
23+
# 2
24+
# \
25+
# 3
26+
root = TreeNode(1, None, TreeNode(2, None, TreeNode(3)))
27+
self.assertEqual(root.postorder(), [3, 2, 1])
28+
29+
def test_balanced_tree(self):
30+
# 2
31+
# / \
32+
# 1 3
33+
root = TreeNode(2, TreeNode(1), TreeNode(3))
34+
self.assertEqual(root.postorder(), [1, 3, 2])
35+
36+
def test_complex_tree(self):
37+
# 4
38+
# / \
39+
# 2 6
40+
# / \ /
41+
# 1 3 5
42+
root = TreeNode(4,
43+
TreeNode(2, TreeNode(1), TreeNode(3)),
44+
TreeNode(6, TreeNode(5)))
45+
self.assertEqual(root.postorder(), [1, 3, 2, 5, 6, 4])
46+
47+
48+
class TestTreeNodePreorder(unittest.TestCase):
49+
def test_single_node(self):
50+
root = TreeNode(1)
51+
self.assertEqual(root.preorder(), [1])
52+
53+
def test_left_skewed(self):
54+
# 3
55+
# /
56+
# 2
57+
#/
58+
#1
59+
root = TreeNode(3, TreeNode(2, TreeNode(1)))
60+
self.assertEqual(root.preorder(), [3, 2, 1])
61+
62+
def test_right_skewed(self):
63+
# 1
64+
# \
65+
# 2
66+
# \
67+
# 3
68+
root = TreeNode(1, None, TreeNode(2, None, TreeNode(3)))
69+
self.assertEqual(root.preorder(), [1, 2, 3])
70+
71+
def test_balanced_tree(self):
72+
# 2
73+
# / \
74+
# 1 3
75+
root = TreeNode(2, TreeNode(1), TreeNode(3))
76+
self.assertEqual(root.preorder(), [2, 1, 3])
77+
78+
def test_complex_tree(self):
79+
# 4
80+
# / \
81+
# 2 6
82+
# / \ /
83+
# 1 3 5
84+
root = TreeNode(4,
85+
TreeNode(2, TreeNode(1), TreeNode(3)),
86+
TreeNode(6, TreeNode(5)))
87+
self.assertEqual(root.preorder(), [4, 2, 1, 3, 6, 5])
88+
89+
class TestTreeNode(unittest.TestCase):
90+
def test_single_node(self):
91+
root = TreeNode(1, None, None)
92+
self.assertEqual(root.inorder(), [1])
93+
94+
def test_left_skewed(self):
95+
root = TreeNode(3, TreeNode(2, TreeNode(1)))
96+
self.assertEqual(root.inorder(), [1, 2, 3])
97+
98+
def test_right_skewed(self):
99+
root = TreeNode(1, None, TreeNode(2, None, TreeNode(3)))
100+
self.assertEqual(root.inorder(), [1, 2, 3])
101+
102+
def test_balanced_tree(self):
103+
root = TreeNode(2, TreeNode(1), TreeNode(3))
104+
self.assertEqual(root.inorder(), [1, 2, 3])
105+
106+
def test_complex_tree(self):
107+
# 4
108+
# / \
109+
# 2 6
110+
# / \ /
111+
# 1 3 5
112+
root = TreeNode(4,
113+
TreeNode(2, TreeNode(1), TreeNode(3)),
114+
TreeNode(6, TreeNode(5)))
115+
self.assertEqual(root.inorder(), [1, 2, 3, 4, 5, 6])
116+
5117
class TestBSTIterator(unittest.TestCase):
6118
def build_tree(self):
7119
# Build a BST:

0 commit comments

Comments
 (0)