-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkth_largest.py
83 lines (63 loc) · 2.13 KB
/
kth_largest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
class TreeNode:
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def print_inorder(self):
"""Visualize the tree in order"""
if self.left:
self.left.print_inorder()
print(self.value, end="")
if self.right:
self.right.print_inorder()
class KthLargest:
def __init__(self, k, initial_nums):
self.k = k
self.root = None
self._build_bst(initial_nums)
def add(self, number):
self.root = self._insert(self.root, number)
return self.get_kth_largest()
def get_kth_largest(self):
# count backwards in order k-1 times
k, kth_largest = self._reverse_inorder(self.root, self.k)
return kth_largest
def _reverse_inorder(self, node, k):
"""Traverse the tree inorder reversed (descending order)"""
if node.right:
k, kth_largest = self._reverse_inorder(node.right, k)
if k == 0:
# we already found the kth_largest
return k, kth_largest
k -= 1
kth_largest = node.value
if k == 0:
# Current node is kth_largest
return k, kth_largest
if node.left:
k, kth_largest = self._reverse_inorder(node.left, k)
return k, kth_largest
def _build_bst(self, nums):
for num in nums:
self.root = self._insert(self.root, num)
def _insert(self, node, number):
if node is None:
node = TreeNode(number)
elif number < node.value:
node.left = self._insert(node.left, number)
else:
node.right = self._insert(node.right, number)
return node
nums = [4, 5, 8, 2]
kth_largest = KthLargest(3, nums)
# tests
assert kth_largest.add(3) == 4
assert kth_largest.add(5) == 5
assert kth_largest.add(10) == 5
assert kth_largest.add(9) == 8
assert kth_largest.add(4) == 8
nums = []
kth_largest = KthLargest(1, nums)
assert kth_largest.add(3) == 3
assert kth_largest.add(2) == 3
assert kth_largest.add(5) == 5