递归:
class Solution {
// 判断二叉搜索树是否有效
public boolean isValidBST(TreeNode root) {
// 递归地检查以 root 为根的子树是否满足 BST 的性质
// 同时定义一个范围 [Long.MIN_VALUE, Long.MAX_VALUE] 来约束节点的值
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
// 判断以 root 为根的子树是否满足 BST 性质
// 同时受到 lower 和 upper 的约束,确保每个节点的值都不小于 lower 且不大于 upper
public boolean isValidBST(TreeNode root, long lower, long upper) {
// 如果当前节点为空,说明没有违反 BST 性质,返回 true
if (root == null) return true;
// 检查当前节点的值是否在允许的范围内
// 如果不在范围内,说明违反了 BST 性质,返回 false
if (root.val <= lower || root.val >= upper) {
return false;
}
// 递归地检查左子树,确保左子树的所有节点值都小于当前节点的值
// 同时左子树的上下界变为 lower 和 root.val
boolean left = isValidBST(root.left, lower, root.val);
// 递归地检查右子树,确保右子树的所有节点值都大于当前节点的值
// 同时右子树的上下界变为 root.val 和 upper
boolean right = isValidBST(root.right, root.val, upper);
// 如果左子树和右子树都满足 BST 性质,则当前子树也满足 BST 性质
// 注意:这里使用逻辑与操作符,只有当左右子树都满足条件时,整个表达式才为 true
return left && right;
}
}