Validate Binary Search Tree — Min/Max Bounds DFS
Advertisement
Problem 371 · Validate Binary Search Tree
Difficulty: Medium · Pattern: BST Bounds DFS
Solutions
# Python
def isValidBST(root):
def valid(node, lo, hi):
if not node: return True
if not lo < node.val < hi: return False
return valid(node.left, lo, node.val) and valid(node.right, node.val, hi)
return valid(root, float('-inf'), float('inf'))
// Java
public boolean isValidBST(TreeNode root) { return valid(root,Long.MIN_VALUE,Long.MAX_VALUE); }
boolean valid(TreeNode node, long lo, long hi) {
if (node==null) return true;
if (node.val<=lo||node.val>=hi) return false;
return valid(node.left,lo,node.val)&&valid(node.right,node.val,hi);
}
// C++
bool valid(TreeNode* node, long lo, long hi) {
if (!node) return true;
if (node->val<=lo||node->val>=hi) return false;
return valid(node->left,lo,node->val)&&valid(node->right,node->val,hi);
}
bool isValidBST(TreeNode* root) { return valid(root,LONG_MIN,LONG_MAX); }
Complexity
- Time: O(n)
- Space: O(h)
Alternative: Inorder should be strictly increasing
def isValidBST(root):
prev = [float('-inf')]
def inorder(node):
if not node: return True
if not inorder(node.left): return False
if node.val <= prev[0]: return False
prev[0] = node.val
return inorder(node.right)
return inorder(root)
Advertisement