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.