Leetcode 98、验证二叉搜索树
1、递归
isValid函数存储着最大值和最小值,对于左子树来说,最大值是根节点的值;对于右子树来说,最小值是根节点的值。
public boolean isValidBST(TreeNode root) {
long max = Long.MAX_VALUE;
long min = Long.MIN_VALUE;
return isValid(root, max, min);
}
public boolean isValid(TreeNode root, long max, long min) {
if(root == null) return true;
if(root.val >= max || root.val <= min) {
return false;
}
boolean left = isValid(root.left, root.val, min);
boolean right = isValid(root.right, max, root.val);
return left && right;
}
2、迭代
使用pre存储前驱结点,如果当前节点小于等于前驱节点,就不符合要求,返回false。
就是中序遍历的迭代法,中间夹杂着对二叉搜索树的判断。
public boolean isValidBST(TreeNode root) {
TreeNode pre = null, curr = root;
Deque<TreeNode> stack = new LinkedList<>();
while(!stack.isEmpty() || curr != null) {
if(curr != null) {
stack.push(curr);
curr = curr.left;
}else{
curr = stack.pop();
if(pre != null && curr.val <= pre.val) {
return false;
}
pre = curr;
curr = curr.right;
}
}
return true;
}