1.题目:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3] 输出:true

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/validate-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


2.代码:

方法一:

思路

要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;//注意这里是返回true
        List<Integer> result = new ArrayList<>();
    method(root,result);
        
    for(int i=0;i<result.size()-1;i++){//判断集合是不是递增的,循环的范围也要注意
       if(result.get(i+1)<=result.get(i)){//注意这里是可以取等号的
           return false;
       }
    }
    return true;

    }
    public void method(TreeNode root, List<Integer> result){//递归中序遍历还是另外写一个方法吧,无返回值的方法
        if(root==null) return ;//注意这里只需要结束方法即可,不用返回值,方法本来就是不要返回值的
         method(root.left,result);//直接先左再右就行
         result.add(root.val);
        method(root.right,result);
    }
}


2.方法二:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
 //一边遍历一遍判断是否是递增的
class Solution {
    long min = Long.MIN_VALUE;//注意不要放到方法里面,不然每次递归都会重新给一个最小值!!!
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;
        boolean left = isValidBST(root.left);//左
        if(root.val>min){//中
            min=root.val;//只要遍历到的后一个结点比前一个大,就重新给min赋值
        }else {
            return false;//否则就直接返回false
        }
        boolean right = isValidBST(root.right);//右
        return left && right;

    }
}


方法三:指针

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
     TreeNode pre = null;//定义一个指针,先指向null,注意也是不能放在方法里面,不然的话每次递归都会弄到
    public boolean isValidBST(TreeNode root) {
        if(root==null) return true;
        boolean left = isValidBST(root.left);//左
        if(pre!=null && pre.val>=root.val){//中,注意这里的条件,既要不为null,而且是大于等于
            return false;
        } else{
            pre=root;//这里的是移动指针,下一层递归?root也是会自己移动的
        }
        boolean right = isValidBST(root.right);//右
        return left && right;

    }
}