题目描述

题解一(递归,设定上下边界)
思路

代码
java
class Solution {
public boolean isValidBST(TreeNode root) {
// 使用 Long 的最大最小值来初始化边界,防止测试用例中出现 Integer.MAX_VALUE 导致判断错误
return isValid(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean isValid(TreeNode node, long lower, long upper) {
if (node == null) {
return true;
}
// 如果当前节点的值不在允许的范围内,则不是二叉搜索树
if (node.val <= lower || node.val >= upper) {
return false;
}
// 递归检查左子树(上限改为当前节点的值)和右子树(下限改为当前节点的值)
return isValid(node.left, lower, node.val) && isValid(node.right, node.val, upper);
}
}
题解二(中序遍历)
思路

代码
java
class Solution {
// 记录前一个遍历到的节点的值,初始设为 Long.MIN_VALUE
//把 pre 声明为类的成员变量时,所有的递归调用都在共享这同一个变量
private long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
// 1. 访问左子树
if (!isValidBST(root.left)) {
return false;
}
// 2. 访问当前节点:如果当前节点的值小于等于前一个节点的值,说明破坏了递增性
if (root.val <= pre) {
return false;
}
pre = root.val; // 更新 pre 为当前节点的值
// 3. 访问右子树
return isValidBST(root.right);
}
}
复杂度分析
- 时间复杂度:O(N)O(N)O(N),其中 NNN 是二叉树的节点数。每个节点恰好被访问一次
- 空间复杂度:O(H)O(H)O(H),其中 HHH 是二叉树的高度。最坏情况下(树退化成链表),递归调用栈的深度为 NNN;最好情况下(平衡二叉树),深度为 logN\log NlogN