-
Notifications
You must be signed in to change notification settings - Fork 43
/
largest-bst-subtree.py
61 lines (47 loc) · 1.79 KB
/
largest-bst-subtree.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
# Given a binary tree, find the largest subtree which is a Binary Search Tree (BST), where largest means subtree with largest number of nodes in it.
# Note:
# A subtree must include all of its descendants.
# Here's an example:
# 10
# / \
# 5 15
# / \ \
# 1 8 7
# The Largest BST Subtree in this case is the highlighted one.
# The return value is the subtree's size, which is 3.
# Hint:
# You can recursively use algorithm similar to 98. Validate Binary Search Tree at each node of the tree, which will result in O(nlogn) time complexity.
# Follow up:
# Can you figure out ways to solve it with O(n) time complexity?
# V0 : DEV
# V1
# V2
# Time: O(n)
# Space: O(h)
class Solution(object):
def largestBSTSubtree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root is None:
return 0
max_size = [1]
def largestBSTSubtreeHelper(root):
if root.left is None and root.right is None:
return 1, root.val, root.val
left_size, left_min, left_max = 0, root.val, root.val
if root.left is not None:
left_size, left_min, left_max = largestBSTSubtreeHelper(root.left)
right_size, right_min, right_max = 0, root.val, root.val
if root.right is not None:
right_size, right_min, right_max = largestBSTSubtreeHelper(root.right)
size = 0
if (root.left is None or left_size > 0) and \
(root.right is None or right_size > 0) and \
left_max <= root.val <= right_min:
size = 1 + left_size + right_size
max_size[0] = max(max_size[0], size)
return size, left_min, right_max
largestBSTSubtreeHelper(root)
return max_size[0]