Validate Binary Search Tree
Problem Statement
You’re a BST inspector ensuring a binary tree follows the rules: left subtree < root < right subtree, recursively. Return true if it’s a valid BST, false otherwise. This medium-level recursive challenge is a structural audit—check those bounds!
Example
Input: root = [2,1,3]
Tree:
2 / \ 1 3
Output: true
Input: root = [5,1,4,null,null,3,6]
Tree:
5 / \ 1 4 / \ 3 6
Output: false (3 < 4 but > 5 violates BST)
Input: root = [1]
Output: true
Code
Java
Python
JavaScript
class Solution { public boolean isValidBST(TreeNode root) { return validate(root, Long.MIN_VALUE, Long.MAX_VALUE); } private boolean validate(TreeNode node, long min, long max) { if (node == null) return true; if (node.val <= min || node.val >= max) return false; return validate(node.left, min, node.val) && validate(node.right, node.val, max); } }
class Solution: def isValidBST(self, root): def validate(node, min_val, max_val): if not node: return True if node.val <= min_val or node.val >= max_val: return False return validate(node.left, min_val, node.val) and validate(node.right, node.val, max_val) return validate(root, float('-inf'), float('inf'))
function isValidBST(root) { function validate(node, min, max) { if (!node) return true; if (node.val <= min || node.val >= max) return false; return validate(node.left, min, node.val) && validate(node.right, node.val, max); } return validate(root, -Infinity, Infinity); }
Explanation
- DFS Insight: Each node must satisfy a range based on its ancestors.
- Flow: Recursively check left < root < right, updating bounds (min, max).
- Example Walkthrough: [5,1,4,null,null,3,6] → 4 fails (3 < 5 needed, but 3 < 4 < 5).
- Key Detail: Use long/float to handle edge values like Integer.MIN_VALUE.
- Inorder Alt: Check if inorder traversal is strictly increasing—also O(n).
Note
Time complexity: O(n), Space complexity: O(h). A BST validation victory—rigorous and recursive!