Validate Binary Search Tree — Min/Max Bounds DFS

Sanjeev SharmaSanjeev Sharma
1 min read

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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro