Leetcode 333. Largest BST Subtree

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,可以递归调用98题 Validate Binary Search Tree.

1. 写一个子函数,递归的计算tree的大小。

2. 从root开始,检查是否为BST,如果是,输出treeSize(root)。如果不是return max(largestBSTSubtree(root.right), largestBSTSubtree(root.left))

 

 1 class Solution(object):
 2     def largestBSTSubtree(self, root):
 3         """
 4         :type root: TreeNode
 5         :rtype: int
 6         """
 7         if self.isValidBST(root):
 8             return self.treeSize(root)
 9         else:
10             return max(self.largestBSTSubtree(root.left), self.largestBSTSubtree(root.right))
11             
12         
13     def isValidBST(self, root):
14         """
15         :type root: TreeNode
16         :rtype: bool
17         """
18         maxInt = 2147483647
19         minInt = -2147483648
20         
21         return self.isBSTHelper(root, minInt, maxInt)
22         
23     def isBSTHelper(self, root, minVal, maxVal):
24         if not root:
25             return True
26         
27         if root.val <= maxVal and root.val >= minVal and self.isBSTHelper(root.left, minVal, root.val - 1) and self.isBSTHelper(root.right, root.val + 1, maxVal):
28             return True
29         else:
30             return False
31             
32     def treeSize(self, root):
33         if not root:
34             return 0
35         else:
36             return 1 + self.treeSize(root.left) + self.treeSize(root.right)
37     

 

转载于:https://www.cnblogs.com/lettuan/p/6347127.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值