-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path93_Apple_Find_largest_subtree_BST.py
executable file
·128 lines (99 loc) · 3.41 KB
/
93_Apple_Find_largest_subtree_BST.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
"""
This problem was asked by Apple.
Given a tree, find the largest tree/subtree that is a BST.
Given a tree, return the size of the largest tree/subtree that is a BST.
"""
class Node:
def __init__(self, data, left=None, right=None):
self.data = data
self.right = right
self.left = left
def __repr__(self):
if self.right is not None:
fmt = '{}({data!r}, {left!r}, {right!r})'
elif self.left is not None:
fmt = '{}({data!r}, {left!r})'
else:
fmt = '{}({data!r})'
return fmt.format(type(self).__name__, **vars(self))
def find_largest_bst_subtree(root):
largest_root = None
largest_size = 0
def helper(root):
nonlocal largest_root, largest_size
is_bst = True
size = 0
if root.left:
child_data, check_bst, temp_size = helper(root.left)
is_bst = is_bst and child_data <= root.data and check_bst
size += temp_size
if root.right:
child_data, check_bst, temp_size = helper(root.right)
is_bst = is_bst and child_data > root.data and check_bst
size += temp_size
if is_bst and largest_size < size+1:
largest_size = size+1
largest_root = root
return root.data, is_bst, size+1
helper(root)
return largest_root, largest_size
if __name__ == '__main__':
"""
5
/ \
largest, size 3--> 2 4
/ \
1 3
"""
tree_1 = Node(data=5,
left=Node(2,
left=Node(1),
right=Node(3)),
right=Node(4)
)
largest_tree, size_of_largest_tree = find_largest_bst_subtree(tree_1)
print("Size of largest tree : {}".format(size_of_largest_tree))
print("Largest tree is : \n {}".format(largest_tree))
# --------------------
print("\n ----------- \n")
"""
50
/ \
30 60 <----- largest, size 5
/ \ / \
5 20 45 70
/ \
65 80
"""
tree_2 = Node(data=50,
left=Node(30,
left=Node(5),
right=Node(20)),
right=Node(60,
left=Node(45),
right=Node(70,
left=Node(65),
right=Node(80)))
)
largest_tree, size_of_largest_tree = find_largest_bst_subtree(tree_2)
print("Size of largest tree : {}".format(size_of_largest_tree))
print("Largest tree is : \n {}".format(largest_tree))
print("\n ----------- \n")
"""
6 <----- largest, size 7
/ \
4 10
/ \ / \
3 5 9 11
"""
tree_3 = Node(data=6,
left=Node(4,
left=Node(4),
right=Node(5)),
right=Node(10,
left=Node(9),
right=Node(11))
)
largest_tree, size_of_largest_tree = find_largest_bst_subtree(tree_3)
print("Size of largest tree : {}".format(size_of_largest_tree))
print("Largest tree is : \n {}".format(largest_tree))