zoukankan      html  css  js  c++  java
  • 边工作边刷题:70天一遍leetcode: day 84-1

    Verify preorder sequence of Binary Search Tree

    要点:simulating preorder sequence:

    • 根据preorder的特点,首先会一直向left subtree方向访问,并且值递减。当遇到一个非递减元素是,说明这个是某个当前路径上结点作为根的right subtree上的点。
    • 首先我们要找到这个根结点:如果之前把所有元素都存到stack里,stack按pop顺序是从小到大的,不断pop,最后一个小于当前元素的结点即为root(记法:因为不断更新low,所以root.val最终在low里)。另外xstack[-1]就停了,也就是把作为right subtree处理。
    • invalid:pop出来的以后,序列都要更大:因为不断向右子树方向走(parent的root已经访问过),low是不断变大的。下一个low可能往父节点走,也可能继续右子树。之后的结点必须大于low,否则invalid

    https://repl.it/CfR8/1
    错误点:注意[9,5,7,8]这是valid的,如果把8放在root 9右边当然不符合,但是也可以放到7右边,preorder并不是唯一的。

    recursion approach

    • based on: preorder序列的第一个点把值域分割:所以很容易adapt到top-down approach
    • recursion:每层loop:根据中点値找到left/right tree的交接点:这样可以recurse到left/right subtree
      • loop中验证subtree的值不能超过上层pass下来的区间
      • redundant: loop中的验证重复进行多次

    https://tonycao.gitbooks.io/leetcode-locked/content/LeetCode Locked/c1.14.html

    O(1): 要点是重用当前sequence:因为stack的size不会超过当前遍历的元素。用global i来记录stack top的位置即可,所以用sequence的[0,i]来存stack。
    错误点:注意i表示当前栈顶,那么初始化为-1。
    https://repl.it/Cf1t

    # Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.
    
    # You may assume each number in the sequence is unique.
    
    # Follow up:
    # Could you do it using only constant space complexity?
    
    # Hide Company Tags Zenefits
    # Hide Tags Tree Stack
    # Hide Similar Problems (M) Binary Tree Preorder Traversal
    
    class Solution(object):
        def verifyPreorder(self, preorder):
            """
            :type preorder: List[int]
            :rtype: bool
            """
            low = -sys.maxint
            stk = []
            for p in preorder:
                if p<low:
                    return False
                    
                while stk and p>stk[-1]:
                    low = stk.pop()
                
                stk.append(p)
            return True
    
    
    import sys
    class Solution:
        # @param {integer[]} preorder
        # @return {boolean}
        def verifyPreorder(self, preorder):
        	low = -sys.maxint
        	i = -1
        	for x in preorder:
        		if x < low:
        			return False
        		while i>=0 and x>preorder[i]:
        			low = preorder[i]
        			i-=1
        		i+=1
        		preorder[i]=x
        	return True
        	
    sol = Solution()
    print sol.verifyPreorder([2, 4, 1])
    print sol.verifyPreorder([40, 30, 35, 80, 100])
    print sol.verifyPreorder([40, 30, 35, 20, 80, 100])
    
    
  • 相关阅读:
    动态规划算法-3
    动态规划算法-2
    动态规划算法-1
    滑动窗口算法-3
    央行副行长提示金融风险:地方偿债高峰期到来
    银行卡换“芯” 更要银行换心
    破解IT运维成本困境,专业化分工是妙方
    php连接mysql
    ajax原生验证用户名是否存在
    ajax跨域问题
  • 原文地址:https://www.cnblogs.com/absolute/p/5815744.html
Copyright © 2011-2022 走看看