Wrong approach
// WRONG: only checks immediate children
boolean isValid(Node n) {
if (n == null) return true;
if (n.left != null && n.left.val >= n.val) return false;
if (n.right != null && n.right.val <= n.val) return false;
return isValid(n.left) && isValid(n.right);
}Advertisement
Correct with bounds
boolean isValid(Node n, Long min, Long max) {
if (n == null) return true;
if ((min != null && n.val <= min) || (max != null && n.val >= max)) return false;
return isValid(n.left, min, (long) n.val)
&& isValid(n.right, (long) n.val, max);
}Advertisement
In-order approach
Integer prev = null;
boolean isValid(Node n) {
if (n == null) return true;
if (!isValid(n.left)) return false;
if (prev != null && n.val <= prev) return false;
prev = n.val;
return isValid(n.right);
}Edge cases
Duplicates: BSTs typically disallow or route consistently. Integer overflow: use Long or null for bounds.