1. /**
    2. * Definition for a binary tree node.
    3. * public class TreeNode {
    4. * int val;
    5. * TreeNode left;
    6. * TreeNode right;
    7. * TreeNode() {}
    8. * TreeNode(int val) { this.val = val; }
    9. * TreeNode(int val, TreeNode left, TreeNode right) {
    10. * this.val = val;
    11. * this.left = left;
    12. * this.right = right;
    13. * }
    14. * }
    15. */
    16. class Solution {
    17. public boolean isValidBST(TreeNode root) {
    18. //最开始根节点,是不做大小值限制的
    19. return check(root,Long.MIN_VALUE,Long.MAX_VALUE);
    20. }
    21. /**
    22. * 检查方法。要求一个节点的值 某个最小值 < 值 < 某个最大值 才是合规的二分搜索树
    23. * @param root
    24. * @param minValue
    25. * @param maxValue
    26. * @return
    27. */
    28. public Boolean check(TreeNode root,Long minValue,Long maxValue){
    29. //1.1:递归结束条件。如果这个节点空了,就返回true
    30. if(root == null){
    31. return true;
    32. }
    33. //1.2:判断条件。如果当前这个节点的值,小于等于了规定范围的最小值,或者大于等于了规定范围最大值,则返回false。注意是开区间。
    34. if(root.val <= minValue || root.val >= maxValue){
    35. return false;
    36. }
    37. //2:递归的方法,去递归检查自己的左子树和右子树
    38. //2.1 左子树应该, 大于上一个节点规定的最小值 且 小于自己这个节点 才是合规的。
    39. Boolean checkLeft = check(root.left,minValue, (long)root.val);
    40. //2.2 右子树应该,大于自己这个节点值 并且 小于上一个节点规定的最大值,才是合规的。
    41. Boolean checkRight = check(root.right, (long)root.val,maxValue);
    42. // 返回左右子树的检查结果。左右子树都true才返回true
    43. return checkLeft && checkRight;
    44. }
    45. }