给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。

tree1.jpeg

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

tree2.jpeg

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
/**
 * 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) {
          return   isSearch(root).isBST;
      }
      public Info isSearch(TreeNode root){
        //如果二叉树为空,返回null
          if(root==null){
              return  null;
          }
          Info searchLeft = isSearch(root.left);
          Info searchRight = isSearch(root.right);
          //设置最大值和最小值都是当前值
          int max=root.val;
          int min= root.val;
          //如果左节点不为空,寻找左节点的最大值和最小值
          if(searchLeft!=null){
              max=Math.max(searchLeft.max,max);
              min=Math.min(searchLeft.min,min);
          }
          //如果右节点不为空,寻找右节点的最大值和最小值
          if(searchRight!=null){
              max=Math.max(max,searchRight.max);
              min=Math.min(min,searchRight.min);
          }
          //如果左节点的最大值小于当前值,且右边的最小值大于当前节点,则满足搜索树条件
         boolean isBST=true;
        if(searchLeft!=null && !searchLeft.isBST){
            isBST=false;
        }
        if(searchRight!=null && !searchRight.isBST){
            isBST=false;
        }
          //左树的最大值是否小于root ,右树的最小值是否大于root
          boolean left = searchLeft ==null ? true :(searchLeft.max<root.val);
        boolean right = searchRight == null ? true :(searchRight.min>root.val);
        if(!left || !right){
            isBST=false;
        }
        return new Info(isBST,max,min);
      }
      public class Info{
       public boolean isBST;
       public int max;
       public int min;
        public Info(boolean isBST,int max,int min){
            this.isBST=isBST;
            this.max=max;
            this.min=min;
        }
      }

}