/**
* 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 check(root,Long.MIN_VALUE,Long.MAX_VALUE);
}
/**
* 检查方法。要求一个节点的值 某个最小值 < 值 < 某个最大值 才是合规的二分搜索树
* @param root
* @param minValue
* @param maxValue
* @return
*/
public Boolean check(TreeNode root,Long minValue,Long maxValue){
//1.1:递归结束条件。如果这个节点空了,就返回true
if(root == null){
return true;
}
//1.2:判断条件。如果当前这个节点的值,小于等于了规定范围的最小值,或者大于等于了规定范围最大值,则返回false。注意是开区间。
if(root.val <= minValue || root.val >= maxValue){
return false;
}
//2:递归的方法,去递归检查自己的左子树和右子树
//2.1 左子树应该, 大于上一个节点规定的最小值 且 小于自己这个节点 才是合规的。
Boolean checkLeft = check(root.left,minValue, (long)root.val);
//2.2 右子树应该,大于自己这个节点值 并且 小于上一个节点规定的最大值,才是合规的。
Boolean checkRight = check(root.right, (long)root.val,maxValue);
// 返回左右子树的检查结果。左右子树都true才返回true
return checkLeft && checkRight;
}
}