class TreeNode {
val: number;
left: TreeNode | null;
right: TreeNode | null;
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
this.val = val === undefined ? 0 : val;
this.left = left === undefined ? null : left;
this.right = right === undefined ? null : right;
}
}
function isValidBST(root: TreeNode | null): boolean {
function helper(node: TreeNode | null, min: number, max: number): boolean {
if (node === null) return true;
if (node.val <= min || node.val >= max) return false;
return helper(node.left, min, node.val) && helper(node.right, node.val, max);
}
return helper(root, -Infinity, Infinity);
}
// Driver code to test the example tree
const root = new TreeNode(5,
new TreeNode(3, new TreeNode(2), new TreeNode(4)),
new TreeNode(7, null, new TreeNode(8))
);
console.log(isValidBST(root) ? "Tree is a valid BST" : "Tree is NOT a valid BST");if (node === null) return true;
Base case: empty node means no violation
if (node.val <= min || node.val >= max) return false;
Check if current node violates BST range rules
return helper(node.left, min, node.val) && helper(node.right, node.val, max);
Recursively check left subtree with updated max and right subtree with updated min