LeetCode 热题 HOT 100 Java题解
98. 验证二叉搜索树
题目:
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例:
输入:
2
/ \
1 3
输出: true
递归
对于每一个节点都需要小于一个上界,大于一个下届,如果递归到当前节点的左子树,那么当前节点的值就是左子树的上界,如果递归到当前节点的右子树,那么当前节点的值就是右子树的下届。本题测试用例使用了很多 i n t int int边界值,所以使用 l o n g long long避免出错,也可以加入特殊判断来处理。
class Solution {
public boolean recur(TreeNode node, long lower, long upper){
if (node == null) return true;
if ((long) node.val > lower && (long) node.val < upper)
return recur(node.left, lower, node.val) && recur(node.right, node.val, upper);
else return false;
}
public boolean isValidBST(TreeNode root) {
return recur(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n)
遍历所有节点。
-
空间复杂度: O ( n ) O(n) O(n)
最差情况栈深度为 O ( n ) O(n) O(n)。
中序遍历
中序遍历,当前节点一定大于上一个节点,因此使用一个全局变量记录上一个节点的值,依次遍历判断即可。这里利用了 I n t e g e r Integer Integer对象可以为 n u l l null null来简化代码。
class Solution {
Integer pre = null;
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
if (!isValidBST(root.left)) return false;
if (pre != null && root.val <= pre) return false;
pre = root.val;
if (!isValidBST(root.right)) return false;
return true;
}
}
复杂度分析
-
时间复杂度: O ( n ) O(n) O(n)
遍历所有节点。
-
空间复杂度: O ( n ) O(n) O(n)
最差情况递归栈深度为 O ( n ) O(n) O(n)。