1. 法一:利用BST性质进行递归
- 二叉搜索树必须满足,并且左子树的值都小于当前结点,右子树的值都大于当前结点。
- 所以我们依次遍历每个结点,并且传入这个结点的合理取值范围。如果它是上一个结点的左孩子,就不能大于父亲。如果它是上一个结点的右孩子,就不能小于父亲
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode node, long lower, long upper) {
if (node == null) return true;
if (node.val <= lower || node.val >= upper) return false;
return isValidBST(node.left, lower, node.val) && isValidBST(node.right, node.val, upper);
}
}
2. 法二:利用中序遍历
二叉搜索树BST的中序遍历顺序,一定是一个递增的序列,所以中序遍历过程中,判断是否后一个值>前一个值,如果是的话,那么这就不是一课BST
- 使用一个全局变量,从而使用递归
class Solution {
private long pre = Long.MIN_VALUE;
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
if (!isValidBST(root.left) || root.val <= pre)return false;
pre = root.val;
return isValidBST(root.right);
}
}
- 不能使用全局变量的情况下,只能用迭代法
class Solution {
public boolean isValidBST(TreeNode root) {
Deque<TreeNode> stack = new LinkedList<TreeNode>();
double inorder = -Double.MAX_VALUE;
while (!stack.isEmpty() || root != null) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (root.val <= inorder) {
return false;
}
inorder = root.val;
root = root.right;
}
return true;
}
}