• 边工作边刷题:70天一遍leetcode: day 94-1


    Largest BST Subtree

    要点:

    • http://articles.leetcode.com/largest-binary-search-tree-bst-in
    • 这题重点是理解题意,还有道类似题 Largest Binary Search Tree (BST) in a Binary Tree – LeetCode( http://articles.leetcode.com/largest-binary-search-tree-bst-in_22
    • 两题的区别:
      • 本题with all descendants:需要所有left/right子树都是bst,并且和root构成bst。而另一题是如果left or right不是bst,root还可以是(这里注意即使不要求所有descendants,结点仍需要连接的才构成bst)
      • 显然如果all descendants,需要检查到最底才能决定,所以bottom up方法。而另一题要从上到下扩展,所以top-down。
    • return value和args:
      • 本题用bottom up的方法,所有min/max是return的,并且要return子树的判定状态和结点个数:-1表示子树不是bst,0个结点还是可以的。其他个数要比较min/max和root。
        • 通过检查-1/0来ignore返回的max/min:所以可以返回0/0作为max/min
      • 另一题return的个数是0或者实际个数,另外如果不能扩展了,要以这个子树为root重新计数

    错误点:

    • 不能因为left子树不符合就提前返回,仍然要遍历right子树来找到其他root对应的bst subtree

    https://repl.it/Cb9Z/2

    
    # 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?
    
    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    
    class Solution(object):
        def largestBSTSubtree(self, root):
            """
            :type root: TreeNode
            :rtype: int
            """
            def bfs(root):
                if not root:
                    return 0,0,0
                    
                isBST = True
                leftnodes, maxl, minl = bfs(root.left)
                if leftnodes==-1 or (leftnodes!=0 and root.val<maxl):
                    isBST = False
                if leftnodes==0:
                    minl = root.val
                
                rightnodes, maxr, minr = bfs(root.right)
                if rightnodes==-1 or (rightnodes!=0 and root.val>minr):
                    isBST = False
                if rightnodes==0:
                    maxr = root.val
                
                if isBST:
                    self.maxLen = max(self.maxLen, leftnodes+rightnodes+1)
                    return leftnodes+rightnodes+1, maxr, minl
                return -1, 0, 0
            
            self.maxLen = 0
            bfs(root)
            return self.maxLen
    
    
  • 相关阅读:
    咖啡豆(JavaBean)•香
    SOC FPGA篇之 如何使用VNC 扩展桌面
    C指针地址运算
    nasm 指令学习
    CPL DPL RPL 及特权间的跳转
    ubuntu终端命令
    自动动手写操作系统 中 _disp_int 堆栈保护错误
    makefile 详解1
    [ 转载] Linux/Unix环境下的make和makefile详解2
    汇编指令: LGDT、LIDT、LLDT、LMSW、LOADALL、LOADALL286、LOCK、LODSB、LODSW、LODSD
  • 原文地址:https://www.cnblogs.com/absolute/p/5815850.html
Copyright © 2020-2023  润新知