★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: http://www.javashuo.com/article/p-zxkxcnsx-hu.html
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html
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.node
Note:
A subtree must include all of its descendants.
Here's an example:git
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.github
Hint:算法
Follow up:
Can you figure out ways to solve it with O(n) time complexity?微信
對於二叉樹,找到最大的子樹,即二叉搜索樹(BST),其中最大的子樹表示其中節點數最多的子樹。this
注:spa
子樹必須包含其全部後代。code
下面是一個例子:htm
10 / \ 5 15 / \ \ 1 8 7
在這種狀況下,最大的BST子樹是突出顯示的子樹。
返回值是子樹的大小,即3。
提示:
您能夠遞歸地使用相似於98的算法。在樹的每一個節點驗證二進制搜索樹,這將致使O(nlogn)時間複雜性。
跟進:
你能想出解決O(N)時間複雜性問題的方法嗎?
Solution:
1 public class TreeNode { 2 public var val: Int 3 public var left: TreeNode? 4 public var right: TreeNode? 5 public init(_ val: Int) { 6 self.val = val 7 self.left = nil 8 self.right = nil 9 } 10 } 11 12 class Solution { 13 func largestBSTSubtree(_ root: TreeNode?) -> Int { 14 var res:[Int] = helper(root) 15 return res[2] 16 } 17 18 func helper(_ node: TreeNode?) -> [Int] 19 { 20 if node == nil 21 { 22 return [Int.max,Int.min,0] 23 } 24 var left:[Int] = helper(node?.left) 25 var right:[Int] = helper(node?.right) 26 if node!.val > left[1] && node!.val < right[0] 27 { 28 return [min(node!.val, left[0]), max(node!.val, right[1]), left[2] + right[2] + 1] 29 } 30 else 31 { 32 return [Int.min, Int.max, max(left[2], right[2])] 33 } 34 } 35 }