bool isValidBST(TreeNode* root) {
vector<long long> values;
function<void(TreeNode*)> inorder = [&](TreeNode* node) {
if (!node) return;
inorder(node->left);
values.push_back(node->val);
inorder(node->right);
};
inorder(root);
for (size_t i = 1; i < values.size(); i++) {
if (values[i] <= values[i - 1]) return false;
}
return true;
}
public boolean isValidBST(TreeNode root) {
List<Integer> values = new ArrayList<>();
inorder(root, values);
for (int i = 1; i < values.size(); i++) {
if (values.get(i) <= values.get(i - 1)) return false;
}
return true;
}
private void inorder(TreeNode node, List<Integer> values) {
if (node == null) return;
inorder(node.left, values);
values.add(node.val);
inorder(node.right, values);
}
def is_valid_bst(root):
values = []
def inorder(node):
if not node: return
inorder(node.left)
values.append(node.val)
inorder(node.right)
inorder(root)
for i in range(1, len(values)):
if values[i] <= values[i - 1]: return False
return True
function isValidBST(root: TreeNode | null): boolean {
const values: number[] = [];
const inorder = (node: TreeNode | null): void => {
if (!node) return;
inorder(node.left);
values.push(node.val);
inorder(node.right);
};
inorder(root);
for (let i = 1; i < values.length; i++) {
if (values[i] <= values[i - 1]) return false;
}
return true;
}
bool isValidBST(TreeNode* root) {
function<bool(TreeNode*, long long, long long)> check = [&](TreeNode* node, long long lo, long long hi) -> bool {
if (!node) return true;
if (node->val <= lo || node->val >= hi) return false;
return check(node->left, lo, node->val) && check(node->right, node->val, hi);
};
return check(root, LLONG_MIN, LLONG_MAX);
}
public boolean isValidBST(TreeNode root) {
return check(root, Long.MIN_VALUE, Long.MAX_VALUE);
}
private boolean check(TreeNode node, long lo, long hi) {
if (node == null) return true;
if (node.val <= lo || node.val >= hi) return false;
return check(node.left, lo, node.val) && check(node.right, node.val, hi);
}
def is_valid_bst(root):
def check(node, lo, hi):
if not node: return True
if node.val <= lo or node.val >= hi: return False
return check(node.left, lo, node.val) and check(node.right, node.val, hi)
return check(root, float('-inf'), float('inf'))
function isValidBST(root: TreeNode | null): boolean {
const check = (node: TreeNode | null, lo: number | null, hi: number | null): boolean => {
if (!node) return true;
if ((lo !== null && node.val <= lo) || (hi !== null && node.val >= hi)) return false;
return check(node.left, lo, node.val) && check(node.right, node.val, hi);
};
return check(root, null, null);
}
bool isValidBST(TreeNode* root) {
vector<TreeNode*> stack;
TreeNode* node = root;
bool hasPrev = false; long long prev = 0;
while (node || !stack.empty()) {
while (node) {
stack.push_back(node);
node = node->left;
}
node = stack.back(); stack.pop_back();
if (hasPrev && node->val <= prev) return false;
hasPrev = true; prev = node->val;
node = node->right;
}
return true;
}
public boolean isValidBST(TreeNode root) {
Deque<TreeNode> stack = new ArrayDeque<>();
TreeNode node = root;
Long prev = null;
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.left;
}
node = stack.pop();
if (prev != null && node.val <= prev) return false;
prev = (long) node.val;
node = node.right;
}
return true;
}
def is_valid_bst(root):
stack = []
node = root
prev = None
while node or stack:
while node:
stack.append(node)
node = node.left
node = stack.pop()
if prev is not None and node.val <= prev: return False
prev = node.val
node = node.right
return True
function isValidBST(root: TreeNode | null): boolean {
const stack: TreeNode[] = [];
let node = root;
let prev: number | null = null;
while (node || stack.length > 0) {
while (node) {
stack.push(node);
node = node.left;
}
node = stack.pop()!;
if (prev !== null && node.val <= prev) return false;
prev = node.val;
node = node.right;
}
return true;
}
bool isValidBST(TreeNode* root) {
bool valid = true;
bool hasPrev = false; long long prev = 0;
TreeNode* cur = root;
while (cur) {
if (!cur->left) {
if (hasPrev && cur->val <= prev) valid = false;
hasPrev = true; prev = cur->val;
cur = cur->right;
} else {
TreeNode* pred = cur->left;
while (pred->right && pred->right != cur) pred = pred->right;
if (!pred->right) {
pred->right = cur;
cur = cur->left;
} else {
pred->right = nullptr;
if (hasPrev && cur->val <= prev) valid = false;
hasPrev = true; prev = cur->val;
cur = cur->right;
}
}
}
return valid;
}
public boolean isValidBST(TreeNode root) {
boolean valid = true;
Long prev = null;
TreeNode cur = root;
while (cur != null) {
if (cur.left == null) {
if (prev != null && cur.val <= prev) valid = false;
prev = (long) cur.val;
cur = cur.right;
} else {
TreeNode pred = cur.left;
while (pred.right != null && pred.right != cur) pred = pred.right;
if (pred.right == null) {
pred.right = cur;
cur = cur.left;
} else {
pred.right = null;
if (prev != null && cur.val <= prev) valid = false;
prev = (long) cur.val;
cur = cur.right;
}
}
}
return valid;
}
def is_valid_bst(root):
valid = True
prev = None
cur = root
while cur:
if not cur.left:
if prev is not None and cur.val <= prev: valid = False
prev = cur.val
cur = cur.right
else:
pred = cur.left
while pred.right and pred.right is not cur: pred = pred.right
if not pred.right:
pred.right = cur
cur = cur.left
else:
pred.right = None
if prev is not None and cur.val <= prev: valid = False
prev = cur.val
cur = cur.right
return valid
function isValidBST(root: TreeNode | null): boolean {
let valid = true;
let prev: number | null = null;
let cur = root;
while (cur) {
if (!cur.left) {
if (prev !== null && cur.val <= prev) valid = false;
prev = cur.val;
cur = cur.right;
} else {
let pred = cur.left;
while (pred.right && pred.right !== cur) pred = pred.right;
if (!pred.right) {
pred.right = cur;
cur = cur.left;
} else {
pred.right = null;
if (prev !== null && cur.val <= prev) valid = false;
prev = cur.val;
cur = cur.right;
}
}
}
return valid;
}