zoukankan      html  css  js  c++  java
  • [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 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    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 }
  • 相关阅读:
    手机也需“绿色环保”,省电类APP或将成为“标配”?
    Netty入门实例及分析
    ios开发经常使用RGB色值
    poj Kaka&#39;s Matrix Travels
    C++ 继承体系中的名称覆盖
    spring-framework-3.2.4与hibernate-release-4.3.5下使用HibernateDaoSupport抛出异常
    Codeforces Round #131 Div1 B
    URAL 1837. Isenbaev&#39;s Number (map + Dijkstra || BFS)
    数据库升级代码学习
    delphi:临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别
  • 原文地址:https://www.cnblogs.com/strengthen/p/10706954.html
Copyright © 2011-2022 走看看