BST Find Minimum Element in DSA Python - Time & Space Complexity
We want to know how long it takes to find the smallest value in a Binary Search Tree (BST).
How does the time needed grow as the tree gets bigger?
Analyze the time complexity of the following code snippet.
def find_min(root):
current = root
while current.left is not None:
current = current.left
return current.value
This code finds the minimum value by moving left until no more left child exists.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Moving down the left child nodes in the tree.
- How many times: At most once per level of the tree, until the leftmost node is reached.
Each step moves one level down the left side of the tree. The time depends on the tree's height.
| Input Size (n) | Approx. Operations (steps down left) |
|---|---|
| 10 | Up to 4 (if tree is balanced) |
| 100 | Up to 7 (if tree is balanced) |
| 1000 | Up to 10 (if tree is balanced) |
Pattern observation: The steps grow slowly, roughly with the tree height, which is much smaller than the total nodes if balanced.
Time Complexity: O(h)
This means the time depends on the tree height, not the total number of nodes.
[X] Wrong: "Finding the minimum always takes time proportional to the total number of nodes (O(n))."
[OK] Correct: Because we only follow the left children, the search stops early at the leftmost node, so it depends on height, not total nodes.
Understanding how tree height affects search time helps you explain why balanced trees are faster and shows you can analyze real data structures clearly.
"What if the tree is not balanced and looks like a linked list? How would the time complexity change?"
Practice
Solution
Step 1: Understand BST property
In a BST, left child nodes have smaller values than their parents, so the smallest value is always towards the left.Step 2: Locate minimum element
By moving left from the root repeatedly until no more left child exists, we reach the minimum element.Final Answer:
At the leftmost node -> Option AQuick Check:
Minimum element = leftmost node [OK]
- Confusing minimum with root node
- Thinking minimum is at rightmost node
- Assuming minimum can be any leaf
root?Solution
Step 1: Check loop for minimum search
while root.left is not None: root = root.left print(root.val) correctly moves left while left child exists, which is how to find minimum in BST.Step 2: Verify other options
while root.right is not None: root = root.right print(root.val) moves right (wrong for minimum), C only checks once, D uses min on values without traversal.Final Answer:
while root.left is not None: root = root.left print(root.val) -> Option BQuick Check:
Traverse left until None = while root.left is not None: root = root.left print(root.val) [OK]
- Traversing right child instead of left
- Not using a loop to reach leftmost node
- Using min() function incorrectly on nodes
class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
def find_min(root):
while root.left:
root = root.left
return root.val
root = Node(10)
root.left = Node(5)
root.right = Node(15)
root.left.left = Node(2)
root.left.right = Node(7)
print(find_min(root))Solution
Step 1: Trace the BST structure
The tree root is 10, left child 5, left-left child 2, left-right child 7, right child 15.Step 2: Follow find_min function
The function moves left from 10 to 5, then left again to 2, which has no left child, so returns 2.Final Answer:
2 -> Option DQuick Check:
Leftmost node value = 2 [OK]
- Returning root value instead of leftmost
- Confusing left-right child as minimum
- Not following loop correctly
def find_min(root):
while root.right:
root = root.right
return root.valSolution
Step 1: Analyze traversal direction
The code moves to the right child repeatedly, which finds the maximum, not minimum.Step 2: Identify correct traversal for minimum
Minimum element is found by moving left child repeatedly, so the code should use root.left.Final Answer:
It traverses right child instead of left child -> Option AQuick Check:
Minimum = traverse left, not right [OK]
- Using right child traversal for minimum
- Ignoring empty tree case
- Assuming root is minimum without traversal
def find_min(root):
# Your code here
Choose the correct code snippet to handle duplicates on the left side.Solution
Step 1: Understand duplicates on left subtree
In BSTs allowing duplicates on left (e.g., left <= parent), the minimum is always the leftmost node.Step 2: Correct approach
while root.left: root = root.left return root.val unconditionally traverses left to the leftmost node, handling duplicates correctly.Step 3: Why others fail
A finds maximum. C and D only traverse if strictly <, stopping early on equal values, missing smaller nodes further left.Final Answer:
while root.left: root = root.left return root.val -> Option CQuick Check:
Unconditional left traversal finds min even with duplicates [OK]
- Ignoring duplicates and returning first left child
- Moving right instead of left
- Stopping traversal too early
Ready to prove it?
Pass the test and this pattern moves unknown
