Solution 1 : recursive
这一题要特别注意corner case。lower和upper用Integer.MIN_VALUE 和 Integer.MAX_VALUE是过不了的。
因为BST规定: left.val<root.val && right.val>root.val。
如果root正好是Integer.MAX_VALUE,会被误判为false
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return helper(root, null, null);
}
public boolean helper(TreeNode root, Integer lower, Integer upper){
if(root == null) return true;
if(upper != null && root.val >= upper) return false;
if(lower != null && root.val <= lower) return false;
boolean l = helper(root.left, lower, root.val);
boolean r = helper(root.right, root.val, upper);
return l && r;
}
}
Solution 2: Inorder
BST树按从小到大遍历其实就是保证中序遍历是一个递增的过程就可。
所以写一个中序遍历。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode cur = root;
double inorder = - Double.MAX_VALUE;
while(cur != null || !s.isEmpty()){
while(cur != null){
s.push(cur);
cur = cur.left;
}
cur = s.pop();
if(cur.val <= inorder) return false;
inorder = cur.val;
cur = cur.right;
}
return true;
}
}