Binary Search Tree (BST)
Binary Search Trees maintain the property that for every node, all values in the left subtree are smaller and all values in the right subtree are larger. This ordering enables O(log n) operations and sorted traversal.Key Properties
BST Invariant
- Left subtree: All values < node.val
- Right subtree: All values > node.val
- Inorder traversal produces sorted sequence
- Search, Insert, Delete: O(log n) average, O(n) worst case
When to Use BST
- Need sorted order efficiently
- Frequent insertions and searches
- Finding kth smallest/largest element
- Range queries
- Finding successor/predecessor
Key Patterns & Techniques
1. BST Search
- Compare with current node
- Go left if target is smaller
- Go right if target is larger
- O(log n) average time
2. Inorder Traversal = Sorted Order
- Process left subtree first
- Then current node
- Then right subtree
- Critical for kth element problems
3. BST Iterator
- Simulate inorder traversal
- Use stack to track path
- O(1) amortized next() operation
4. Range Queries
- Prune search based on range
- Skip entire subtrees outside range
- Efficient O(log n + k) where k is result size
Common Approaches
BST Search Template
BST Insert
Kth Smallest Element (Inorder)
BST Range Sum
BST Iterator
Problems in This Category
027. Range Sum of BST
Easy | Frequency: 69.5%Prune search space using BST property - skip subtrees outside range.
092. Kth Smallest Element in BST
Medium | Frequency: 32.0%Inorder traversal gives sorted order - stop at kth element.
051. Binary Search Tree Iterator
Medium | Frequency: 51.9%Implement iterator with O(1) average time using controlled inorder.
060. Closest BST Value
Easy | Frequency: 47.0%Binary search on BST to find value closest to target.
Complexity Characteristics
| Operation | Average | Worst Case | Notes |
|---|---|---|---|
| Search | O(log n) | O(n) | Balanced vs skewed tree |
| Insert | O(log n) | O(n) | Maintains BST property |
| Delete | O(log n) | O(n) | Most complex operation |
| Inorder Traversal | O(n) | O(n) | Gives sorted sequence |
| Kth Smallest | O(k + log n) | O(n) | Stop early in inorder |
| Range Query | O(log n + k) | O(n) | Prune irrelevant subtrees |
Interview Tips
Pattern Recognition
- “Kth smallest/largest in BST” → Inorder traversal
- “Values in range [low, high]” → Prune with BST property
- “Closest value to target” → Binary search on BST
- “Validate BST” → Check inorder is sorted
- “Iterator for BST” → Controlled inorder with stack
- “Successor/predecessor” → Inorder with tracking
Common Mistakes
- Forgetting BST property applies to entire subtree, not just children
- Not pruning search space in range queries
- Using BFS when inorder traversal is needed
- Modifying tree during iteration
- Assuming tree is balanced (worst case O(n) height)
Key Insights
- Inorder traversal = sorted order - use for kth element, validation
- Prune aggressively - skip entire subtrees outside target range
- Iterative > Recursive for space efficiency (O(1) vs O(h))
- Stack for iterator simulates recursive inorder call stack
- BST property allows O(log n) search, but degrades to O(n) if unbalanced
BST vs Hash Table
| Feature | BST | Hash Table |
|---|---|---|
| Search | O(log n) | O(1) average |
| Insert | O(log n) | O(1) average |
| Delete | O(log n) | O(1) average |
| Sorted Order | Yes | No |
| Range Queries | O(log n + k) | O(n) |
| Kth Element | O(k) | O(n) |
| Space | O(n) | O(n) |
Advanced Patterns
Validate BST
BST from Preorder
Delete Node in BST
Lowest Common Ancestor in BST
Self-Balancing Trees
For guaranteed O(log n) operations, use self-balancing BSTs:- AVL Tree: Strict balancing, faster lookups
- Red-Black Tree: Relaxed balancing, faster insert/delete
- B-Tree: For disk storage, multiple keys per node
- C++
std::map,std::set - Java
TreeMap,TreeSet - Python
sortedcontainers.SortedDict(external library)
Pro Tip: The BST property enables aggressive pruning. In range queries or searches, skip entire subtrees that can’t contain the answer. This makes BST operations much faster than O(n) traversal of unsorted trees.