判断是不是二叉搜索树

129 阅读1分钟

描述

给定一个二叉树根节点,请你判断这棵树是不是二叉搜索树。

二叉搜索树满足每个节点的左子树上的所有节点均小于当前节点且右子树上的所有节点均大于当前节点。

例:

图1

图2

数据范围:节点数量满足 1≤n≤104 1≤n≤104  ,节点上的值满足 −231≤val≤231−1 −231≤val≤231−1 

示例1

输入:

{1,2,3}

返回值:

false

说明:

如题面图1 

示例2

输入:

{2,1,3}

返回值:

true

说明:

如题面图2 

1.思路整理

判断搜索二叉树(BST): 考虑搜索二叉树的定义,每一个节点的值应该大于等于左子树中的最大值,小于等于右子树中的最小值。所以我们可以利用递归遍历每一个节点,如果某个节点不满足定义,则不合法,直接返回false。

图解展示:

alt


/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param root TreeNode类 
     * @return bool布尔型
     */
    public boolean isValidBST (TreeNode root) {
        
        return BST(root,Integer.MIN_VALUE,Integer.MAX_VALUE);
    }
    
    //left为当前左子树最大值,right为当前右子树最小值
    private boolean BST(TreeNode root,long left,long right){
        //递归终止条件
        if(root==null) return true;
        //如果当前节点小于等于左子树节点最大值或者大于等于右子树节点最小值,则不合法
        if(root.val<=left||root.val>=right){
            return false;
        }
        //往左子树递归时,left不变,对应右子树由于要考虑当前节点,right变为root.val,同理考虑右子树
        return BST(root.left,left,root.val)&&BST(root.right,root.val,right);
    }
}