class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) return true;
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
while (root != null || !stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
if (pre != null && root.val <= pre.val) return false;
pre = root;
root = root.right;
}
return true;
}
}
Here we integrate traversal with judge statements! For each root we traverse from left to root to right and check if their values are in an increasing order. If passed, then we pop the next root node from stack (go up to one level) and do the same things.
Recursion with Min and Max values:
public class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
if (root == null) return true;
if (root.val >= maxVal || root.val <= minVal) return false;
return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
}
}
A very wise inorder traversal solution:
Here we integrate traversal with judge statements! For each root we traverse from left to root to right and check if their values are in an increasing order. If passed, then we pop the next root node from stack (go up to one level) and do the same things.
Recursion with Min and Max values: