/** * 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; }}