• 98. Validate Binary Search Tree


    一开始in-order traverse
    然后加入到STACK里,最后一个一个POP STACK里的元素,POP出就和堆顶比较,不大于就说明不符合规定。
    AC了,不过7MS。问题在于必须遍历一次,然后再重新遍历STACK,可能提前结束判断。
    需要一个在遍历时一旦发现不符合规定直接停止的办法。

    其实还是in-order traverse,只不过要记录prev
    NODE用于比较。

    TreeNode prev = null;
        public boolean isValidBST(TreeNode root) 
        {
            if( root == null) return true;
            if(!isValidBST(root.left)) return false;
            if(prev != null && prev.val >= root.val) return false;
            prev = root;
            if(!isValidBST(root.right)) return false;
            
            return true;
        }
    
    

    prev相当于栈顶元素,比较如果不满足直接就可以RETURN FALSE,提前结束。




    二刷。

    一看知道是in-order traversal来判断,用一个全局变量来标记上一个NODE的VALUE。

    一开始全局变量用的int,初始 Integer.MIN_VALUE。
    结果发现TEST CASE里面各种
    [-2147483648,-2147483648]
    [-2147483648]
    [2147483647,null,-2147483648]
    这样的。。

    设计的这个的人素质也太差了。。。诚心搞我呀。
    image

    全局变量换成NODE就行了,其实一开始用MIN_VALUE主要就是为了第一次判断不出错,用NULL更好。

    public class Solution 
    {
        public TreeNode temp = null;
    
        public boolean isValidBST(TreeNode root) 
        {
            if(root == null) return true;
            if(isValidBST(root.left))
            {
                if(temp == null || temp.val < root.val)
                {
                    temp = root;
                    return (isValidBST(root.right));
                }
                else return false;
            }
            else return false;
            
            
            
        }
    }
    



    三刷。

    通过in-order traversal,最后的结果是sorted的就肯定没问题,比较直白,就不说怎么做了。

    这样需要一个Stack用于traversal which is O(n)

    另一种方式不容易想到,代表的一种思维很关键。

    Binary Search Tree是排序好的,对于一个ROOT来说,他的值要大于左边的最大值,小于右边的最小值,这就等于规定了一个区间,我们可以通过这个来判断每个ROOT是否符合规定。

    当然bottom-up要比top-down快的多。

    回头看发现这里说错了,不是bottom-up,这个代码的本质还是in-order traversal,记录当前上一个值,下一个值要比上一个值大,因为in-order traversal是sorted..as I mentioned above..

    public class Solution {
        
        TreeNode tempMin = null;
        
        public boolean isValidBST(TreeNode root) {
            if (root == null) {
                return true;
            }
            
            if (isValidBST(root.left)) {
                if (tempMin == null || root.val > tempMin.val) {
                    tempMin = root;
                    return isValidBST(root.right);
                }
            }
            return false;
        }
    }
    

    代码里面

    tempMax = root;
    

    这一行其实是在记录previous value which should be less than next one.


    一开始说的bottom-up,用post-order做应该是这样的。

    public class Solution {
        
        public boolean isValidBST(TreeNode root) {
    
            return helper(root, null, null);
        }
        
        public boolean helper(TreeNode root, Integer min, Integer max) {
            if (root == null) return true;
            
            boolean left = helper(root.left, min, root.val);
            boolean right = helper(root.right, root.val, max);
            
            if (left && right) {
                if (min != null && root.val <= min) {
                    return false;
                }
                if (max != null && root.val >= max) {
                    return false;
                }
                return true;
            } 
            
            return false;
        }
    }
    

    缺点是不能提前停止。 有点太为了体现POST-ORDER的顺序,其实可以先比较,再深入,这样有问题直接停止了。

    后来想了一下,这个题bottom-up不一定比top-down好。。。

    另外。。最大最小值不能用Integer自带的2个,因为test case里面有。。。

  • 相关阅读:
    World Cup
    Eva's Problem
    Number-guessing Game
    WisKey的眼神
    Vowel Counting
    The 3n + 1 problem
    超级楼梯
    母牛的故事
    素数回文
    画8
  • 原文地址:https://www.cnblogs.com/reboot329/p/5877835.html
Copyright © 2020-2023  润新知