• 2.11
    • 最小值应该为 long 类型,思路秒了
class Solution {
    long current = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;
        if(!isValidBST(root.left)) return false;
        if(root.val<=current){
            return false;
        }else{
            current = root.val;
            return  isValidBST(root.right);
        }
    }
}
  • 1.26

    • 第二种方法更简单,但需要注意最小一个为 long 类型的最小值
  • 1.16

    • 找到宝藏了,刚开始的思路有问题

      • 之前是递归比较左右子树节点大小,是局部的
      • 正确的思路是维护全局左右边界值,带资入组(long 类型)
    • 跟对称树思路差不多,在比较后,不能 else 返回真,因为目前是局部的,需要整体都为真才能返回真

      • 第二种思路:把严格二叉搜索压扁成递增数组,用 pre 当做前指针从大往小递归,也很精彩 ​-
class Solution {
    public boolean isValidBST(TreeNode root) {
        // if(root.right==null||root.left==null) return false;
        // if(root.left.val>=root.right.val) return false;
 
        // boolean res1 = isValidBST(root.left);
        // boolean res2 =  isValidBST(root.right);
        // return res1&&res2;
        long min = Long.MIN_VALUE;
        long max = Long.MAX_VALUE;
        return check(root,min,max);
        
    }
    public boolean check(TreeNode root,long min,long max){
        if(root==null) return true;
 
        if(root.val<=min||root.val>=max){
            return false;
        }
        return check(root.left,min,root.val)&&check(root.right,root.val,max);
    }
}

11.11 - 声明一个最小数pre这里为long,因为题目范围暗示了 - 算是一个失衡递归,pre是上个节点,所以失衡到底时影判断为root严格>pre才返回true,否则返回false - if(root.val <= prev) return false;错误时才退出递归,不能反方向,因为返回true会提前返回中断递归

class Solution {
    long prev = Long.MIN_VALUE;
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;
        if(!isValidBST(root.left)) return false;
        if(root.val <= prev) return false;
        prev = root.val;
        return isValidBST(root.right);
    }
}
  • 其实没那么难,就是用一个pre来记录上一个root节点
  • 其中,pre为long型,默认最小值