BST Search Operation in DSA Python - Time & Space Complexity
We want to understand how long it takes to find a value in a Binary Search Tree (BST).
The question is: how does the search time grow as the tree gets bigger?
Analyze the time complexity of the following code snippet.
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def bst_search(root, target):
if root is None or root.val == target:
return root
if target < root.val:
return bst_search(root.left, target)
else:
return bst_search(root.right, target)
This code searches for a target value in a BST by moving left or right depending on comparisons.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls moving down one node at a time.
- How many times: At most once per tree level, until the target is found or tree ends.
Each step moves down one level of the tree, so the number of steps depends on the tree height.
| Input Size (n) | Approx. Operations (steps) |
|---|---|
| 10 | About 4 steps (height ~ log2(10)) |
| 100 | About 7 steps (height ~ log2(100)) |
| 1000 | About 10 steps (height ~ log2(1000)) |
Pattern observation: The steps grow slowly, roughly doubling the input size adds only one more step.
Time Complexity: O(h) where h is the tree height
This means the search time depends on how tall the tree is, not just how many nodes it has.
[X] Wrong: "Searching a BST always takes the same time as the number of nodes (O(n))."
[OK] Correct: If the tree is balanced, search only goes down the height, which is much smaller than total nodes.
Understanding BST search time helps you explain how data structure shape affects speed, a key skill in coding interviews.
"What if the BST is completely unbalanced and looks like a linked list? How would the time complexity change?"
Practice
search operation in a Binary Search Tree (BST)?Solution
Step 1: Understand the purpose of search in BST
The search operation is used to check if a specific value is present in the BST.Step 2: Differentiate from other operations
Insertion adds new values, deletion removes values, and traversal visits all nodes. Search only checks for existence.Final Answer:
To find whether a given value exists in the BST -> Option AQuick Check:
Search = Find value [OK]
- Confusing search with insert or delete
- Thinking search returns all nodes
- Assuming search modifies the tree
Solution
Step 1: Identify required parameters for BST search
The search needs the root node to start and the key to find.Step 2: Match parameters order
Common convention is root first, then key, sodef search(root, key):is correct.Final Answer:
def search(root, key): -> Option DQuick Check:
Function(root, key) correct signature [OK]
- Swapping parameter order
- Missing one parameter
- Using only one parameter
search(root, 15), what will be the output?class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def search(root, key):
if root is None or root.val == key:
return root
if key < root.val:
return search(root.left, key)
return search(root.right, key)
root = Node(10)
root.left = Node(5)
root.right = Node(20)
root.left.left = Node(3)
root.left.right = Node(7)
root.right.left = Node(15)
root.right.right = Node(25)
result = search(root, 15)
print(result.val if result else 'Not found')Solution
Step 1: Trace search path for key 15
Start at root (10). Since 15 > 10, go right to node 20. Then 15 < 20, go left to node 15.Step 2: Check node value
Node value is 15, matches key, so return this node.Final Answer:
15 -> Option AQuick Check:
Search found node with value 15 [OK]
- Stopping search too early
- Going wrong direction at node 20
- Returning root value instead of found node
def search(root, key):
if root is None:
return None
if root.val == key:
return root
if key > root.val:
return search(root.left, key)
else:
return search(root.right, key)Solution
Step 1: Analyze recursive calls
For BST, if key > root.val, search should go right subtree, but code callssearch(root.left, key).Step 2: Identify correct direction
Correct is to go right when key > root.val and left when key < root.val.Final Answer:
The recursive calls to left and right are swapped -> Option CQuick Check:
Swap left/right calls to fix search [OK]
- Swapping left and right recursive calls
- Forgetting base case for None
- Incorrect comparison operators
BST structure:
10
/ \
5 15
/ \ \
3 7 20
Choose the correct sequence of visited nodes for
search(root, 8).Solution
Step 1: Start at root and compare with 8
8 < 10, go left to 5.Step 2: Compare with 5 and go right
8 > 5, go right to 7.Step 3: Compare with 7 and go right
8 > 7, go right which is None (no node), search ends.Final Answer:
[10, 5, 7, None] -> Option BQuick Check:
Search path includes None when key not found [OK]
- Stopping at last node without None
- Going left instead of right at 7
- Ignoring None as end of search
Ready to prove it?
Pass the test and this pattern moves unknown
