98. 验证二叉搜索树
核心逻辑
验证二叉搜索树(BST)需要满足:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
本解法采用 分治 + 上下界约束 的策略:
- 每层递归传入当前节点允许的 最大值(max) 和 最小值(min)。
- 左子树的节点值必须小于当前节点值(更新
max为当前节点值)。 - 右子树的节点值必须大于当前节点值(更新
min为当前节点值)。 - 一旦某个节点超出范围,立即返回
false。
🎉不断更新max和min,使节点值在一个合理的区间之内
🔥代码实现(含详细变量注释)
class Solution {
public boolean isValidBST(TreeNode root) {
// 初始调用:根节点的值必须介于 Long.MIN_VALUE 和 Long.MAX_VALUE 之间
// 使用 Long 类型是为了防止测试用例中节点值等于 Integer 边界时出问题
return Helper(root, Long.MAX_VALUE, Long.MIN_VALUE);
}
/**
* 递归辅助函数,用于验证以 root 为根的子树是否为 BST
*
* @param root 当前需要验证的树节点
* @param max 当前节点允许的最大值(上界),即该节点 val 必须 < max
* @param min 当前节点允许的最小值(下界),即该节点 val 必须 > min
* @return 以 root 为根的子树是否是有效的 BST
*/
public boolean Helper(TreeNode root, long max, long min) {
// 基本情况:空节点符合 BST 定义
if (root == null) {
return true;
}
// 关键判断:如果当前节点值 大于等于 上界(max) 或者 小于等于 下界(min),则不合法
// 注意:BST 定义要求 左 < 根 < 右,所以等于号也不满足
if (root.val >= max || root.val <= min) {
return false;
}
// 分治思想:递归验证左右子树
// 左子树:所有节点值必须 < root.val,所以上界(max) 更新为 root.val,下界(min) 保持不变
// 右子树:所有节点值必须 > root.val,所以下界(min) 更新为 root.val,上界(max) 保持不变
return Helper(root.left, root.val, min) && Helper(root.right, max, root.val);
}
}
- ⏱️复杂度分析
时间复杂度:O(N),其中 N 是二叉树的节点数。需要遍历每个节点一次。
空间复杂度:O(H),其中 H 是二叉树的高度。最坏情况下(树为链状)递归深度为 N,空间复杂度为 O(N);最好情况下(平衡树)空间复杂度为 O(log N)。