/**
* 自己的代码,递归方法
* 这里需要用long类型,如果用Integer.MAX_VALUE或者Integer.MIN_VALUE,无法判断节点是否符合要求:
* 例如,当一个节点值没有上限(一直是右子树),将max设为Integer.MAX_VALUE,会使其不能等于Integer.MAX_VALUE,但其实等于Integer.MAX_VALUE也是可以的
* 所以,最初设置的min和max必须超出int的范围
* Runtime: 0 ms, faster than 100.00%
* Memory Usage: 38.5 MB, less than 71.26%
*/
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean isValidBST(TreeNode root, long min, long max) {
if (root == null)
return true;
if (root.val <= min || root.val >= max)
return false;
return isValidBST(root.left, min, root.val) && isValidBST(root.right, root.val, max);
}
}
/**
* 受到discuss说能用循环的启发,自己写的
* Runtime: 1 ms, faster than 25.38%
* Memory Usage: 38.6 MB, less than 56.46%
*/
class Solution {
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> s = new Stack<>();
TreeNode curr = root;
long pre = Long.MIN_VALUE;
while (curr != null || !s.isEmpty()) {
while (curr != null) {
s.push(curr);
curr = curr.left;
}
curr = s.pop();
if (curr.val <= pre)
return false;
pre = curr.val;
curr = curr.right;
}
return true;
}
}