Skip to content

Commit 85f5f35

Browse files
committed
BSTIterator
1 parent 177631d commit 85f5f35

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from typing import Optional
2+
3+
class BSTIterator:
4+
def __init__(self, root: Optional[TreeNode]):
5+
self.stack = []
6+
self.root = root
7+
cur = root
8+
while cur:
9+
self.stack.append(cur)
10+
cur = cur.left
11+
12+
def next(self) -> int:
13+
pop = self.stack.pop()
14+
cur = pop.right
15+
while cur:
16+
self.stack.append(cur)
17+
cur = cur.left
18+
return pop.val
19+
20+
def hasNext(self) -> bool:
21+
return len(self.stack) > 0
22+
23+
class TreeNode:
24+
def __init__(self, val:0, left: None, right: None):
25+
self.val = val
26+
self.left = left
27+
self.right = right
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import unittest
2+
from iterator import TreeNode
3+
from iterator import BSTIterator
4+
5+
class TestBSTIterator(unittest.TestCase):
6+
def build_tree(self):
7+
# Build a BST:
8+
# 7
9+
# / \
10+
# 3 15
11+
# / \
12+
# 9 20
13+
n9 = TreeNode(9, None, None)
14+
n20 = TreeNode(20, None, None)
15+
n15 = TreeNode(15, n9, n20)
16+
n3 = TreeNode(3, None, None)
17+
root = TreeNode(7, n3, n15)
18+
return root
19+
20+
def test_inorder_traversal(self):
21+
root = self.build_tree()
22+
it = BSTIterator(root)
23+
result = []
24+
while it.hasNext():
25+
result.append(it.next())
26+
self.assertEqual(result, [3, 7, 9, 15, 20])
27+
28+
def test_single_node(self):
29+
root = TreeNode(42, None, None)
30+
it = BSTIterator(root)
31+
self.assertTrue(it.hasNext())
32+
self.assertEqual(it.next(), 42)
33+
self.assertFalse(it.hasNext())
34+
35+
def test_empty_tree(self):
36+
it = BSTIterator(None)
37+
self.assertFalse(it.hasNext())
38+
39+
def test_alternating_next_and_hasNext(self):
40+
root = self.build_tree()
41+
it = BSTIterator(root)
42+
self.assertTrue(it.hasNext())
43+
self.assertEqual(it.next(), 3)
44+
self.assertTrue(it.hasNext())
45+
self.assertEqual(it.next(), 7)
46+
self.assertTrue(it.hasNext())
47+
self.assertEqual(it.next(), 9)
48+
self.assertTrue(it.hasNext())
49+
self.assertEqual(it.next(), 15)
50+
self.assertTrue(it.hasNext())
51+
self.assertEqual(it.next(), 20)
52+
self.assertFalse(it.hasNext())
53+
54+
55+
if __name__ == '__main__':
56+
unittest.main()

0 commit comments

Comments
 (0)