为有牺牲多壮志,敢教日月换新天。

[Swift]LeetCode333. 最大的二分搜索子树 $ Largest BST Subtree

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: https://www.cnblogs.com/strengthen/p/10706954.html 
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

热烈欢迎,请直接点击!!!

进入博主App Store主页,下载使用各个作品!!!

注:博主将坚持每月上线一个新app!!!

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:

  1. 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?


对于二叉树,找到最大的子树,即二叉搜索树(BST),其中最大的子树表示其中节点数最多的子树。

 

注:

子树必须包含其所有后代。

下面是一个例子:

    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 }

 

posted @ 2019-04-14 20:53  为敢技术  阅读(447)  评论(0编辑  收藏  举报