Validate Binary Search Tree
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
Example 1:
2
/ \
1 3
Binary tree [2,1,3], return true.
Example 2:
1
/ \
2 3
Binary tree [1,2,3], return false.
Tips:
Recursive: 设一个min一个max,如果root <= min或者 root >= max就返回false。
Iterative:就中序遍历呗, cost O(logN) space
Code:
Recursive:
public class Solution {
public boolean isValidBST(TreeNode root) {
return isValid(root, null, null);
}
public boolean isValid(TreeNode root, Integer min, Integer max) {
if(root == null) return true;
if(min != null && root.val <= min) return false;
if(max != null && root.val >= max) return false;
return isValid(root.left, min, root.val) && isValid(root.right, root.val, max);
}
}
Iterative:
public boolean isValidBST (TreeNode root){
Stack<TreeNode> stack = new Stack<TreeNode> ();
TreeNode cur = root ;
TreeNode pre = null ;
while (!stack.isEmpty() || cur != null) {
if (cur != null) {
stack.push(cur);
cur = cur.left ;
} else {
TreeNode p = stack.pop() ;
if (pre != null && p.val <= pre.val) {
return false ;
}
pre = p ;
cur = p.right ;
}
}
return true ;
}
另一种比较直观的recursive:
class Solution {
public boolean isValidBST(TreeNode root) {
return check(root, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private boolean check(TreeNode root, int min, int max) {
if (root == null) {
return true;
}
if (root.val < min || root.val > max) {
return false;
}
if (root.val == Integer.MIN_VALUE && root.left != null) {
return false;
}
if (root.val == Integer.MAX_VALUE && root.right != null) {
return false;
}
return check(root.left, min, root.val - 1) && check(root.right, root.val + 1, max);
}
}