BST Find Minimum Element in DSA Java - Time & Space Complexity
We want to understand how long it takes to find the smallest value in a Binary Search Tree (BST).
How does the time needed change as the tree grows bigger?
Analyze the time complexity of the following code snippet.
public int findMin(TreeNode root) {
TreeNode current = root;
while (current.left != null) {
current = current.left;
}
return current.val;
}
This code finds the minimum value by moving left until no more left child exists.
- 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.
As the tree grows taller, the number of steps to find the minimum grows with the height of the tree.
| Input Size (n) | Approx. Operations (steps down left) |
|---|---|
| 10 | Up to 4 (if tree height is 4) |
| 100 | Up to 7 (if tree height is 7) |
| 1000 | Up to 10 (if tree height is 10) |
Pattern observation: The steps grow with the tree height, which can be much smaller than total nodes if the tree is balanced.
Time Complexity: O(h)
This means the time depends on the height of the tree, not the total number of nodes.
[X] Wrong: "Finding the minimum always takes time proportional to the number of nodes (n)."
[OK] Correct: The search only moves down the left side, so it depends on the tree height, which can be much smaller than n if the tree is balanced.
Understanding how tree height affects search time helps you explain efficiency clearly and shows you know how data structure shape impacts performance.
"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.Step 2: Locate minimum element
The smallest value is found by moving left until no more left child exists.Final Answer:
At the leftmost node -> Option AQuick Check:
Minimum = leftmost node [OK]
- Confusing minimum with root node
- Thinking minimum is rightmost node
- Assuming minimum can be any leaf
root?Solution
Step 1: Check loop condition for minimum
Minimum is found by moving left while left child exists.Step 2: Verify code correctness
while(root.left != null) { root = root.left; } return root.data; moves left until left child is null, then returns data.Final Answer:
while(root.left != null) { root = root.left; } return root.data; -> Option BQuick Check:
Loop left until null, then return [OK]
- Traversing right child instead of left
- Returning root data without traversal
- Ignoring null root check
class Node {
int data;
Node left, right;
Node(int d) { data = d; left = right = null; }
}
Node root = new Node(10);
root.left = new Node(5);
root.right = new Node(15);
root.left.left = new Node(2);
root.left.right = new Node(7);
Node current = root;
while(current.left != null) {
current = current.left;
}
System.out.println(current.data);Solution
Step 1: Trace the tree structure
Root=10, left=5, right=15, left.left=2, left.right=7.Step 2: Follow while loop to find minimum
Start at 10, move left to 5, then left to 2, which has no left child.Final Answer:
2 -> Option AQuick Check:
Leftmost node data = 2 [OK]
- Printing root data instead of leftmost
- Confusing left and right traversal
- Stopping loop too early
public int findMin(Node root) {
if(root == null) return -1;
while(root.right != null) {
root = root.right;
}
return root.data;
}Solution
Step 1: Analyze traversal direction
Minimum element is found by moving left, not right.Step 2: Identify correct traversal
Loop should check root.left != null and move root = root.left.Final Answer:
Should traverse left child, not right child -> Option DQuick Check:
Minimum = leftmost node, so traverse left [OK]
- Traversing right child instead of left
- Returning -1 incorrectly
- Checking data for null instead of node
public int findMinUnique(Node root) {
Set<Integer> seen = new HashSet<>();
int min = Integer.MAX_VALUE;
while(root != null) {
if(!seen.contains(root.data)) {
min = Math.min(min, root.data);
seen.add(root.data);
}
root = root.left;
}
return min;
}What is the main issue with this method?
Solution
Step 1: Understand traversal logic
Method only moves down left children, ignoring right subtree.Step 2: Identify missed nodes
Duplicates or unique values in right subtree are missed.Step 3: Correct approach
To find minimum unique, full tree traversal (e.g., inorder) is needed.Final Answer:
It only checks left children, missing other nodes -> Option CQuick Check:
Partial traversal misses right subtree [OK]
- Assuming left path covers all nodes
- Ignoring duplicates in right subtree
- Using HashSet without full traversal
Ready to prove it?
Pass the test and this pattern moves unknown
