Kth Smallest Element in BST in DSA C - Time & Space Complexity
We want to understand how the time needed to find the kth smallest element in a Binary Search Tree (BST) changes as the tree grows.
Specifically, how does the number of steps grow when the tree has more nodes?
Analyze the time complexity of the following code snippet.
int inorder(TreeNode* root, int k, int* count, int* result) {
if (!root) return 0;
if (inorder(root->left, k, count, result)) return 1;
(*count)++;
if (*count == k) {
*result = root->val;
return 1;
}
return inorder(root->right, k, count, result);
}
int kthSmallest(TreeNode* root, int k) {
int count = 0;
int result = -1;
inorder(root, k, &count, &result);
return result;
}
This code performs an inorder traversal of the BST to find the kth smallest element by counting nodes visited.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive inorder traversal visiting nodes.
- How many times: Up to k nodes are visited before stopping.
The number of nodes visited grows with k, not necessarily the total number of nodes n.
| Input Size (n) | Approx. Operations (visits) |
|---|---|
| 10 | Up to k (≤ 10) |
| 100 | Up to k (≤ 100) |
| 1000 | Up to k (≤ 1000) |
Pattern observation: The work depends mostly on k, the position of the element we want, not the total size n.
Time Complexity: O(h + k)
This means the time grows with the height of the tree plus the kth position we want to find.
[X] Wrong: "The time is always O(n) because we might visit all nodes."
[OK] Correct: The traversal stops as soon as the kth smallest is found, so often fewer than n nodes are visited, especially if k is small.
Understanding how traversal limits work helps you explain efficient search in trees, a common skill interviewers look for.
"What if the BST is balanced vs completely skewed? How would the time complexity change?"
Practice
kth smallest element in a BST mean?Solution
Step 1: Understand BST property
A Binary Search Tree (BST) stores elements so that left subtree has smaller values and right subtree has larger values.Step 2: Define kth smallest element
The kth smallest element is the one that appears in the kth position when all elements are sorted in ascending order.Final Answer:
The element that appears in the kth position when BST elements are sorted in ascending order -> Option AQuick Check:
kth smallest = kth in sorted order [OK]
- Confusing kth smallest with kth largest
- Thinking kth smallest means kth level node
- Assuming frequency matters
struct Node?Solution
Step 1: Understand function parameters
The function needs the root pointer to the BST and the integer k to find kth smallest.Step 2: Check parameter types
Passingstruct Node*for root andintfor k is correct. Return type should beintfor the element value.Final Answer:
int kthSmallest(struct Node* root, int k); -> Option CQuick Check:
Correct signature includes pointer and k parameter [OK]
- Passing root by value instead of pointer
- Missing k parameter
- Wrong return type or missing return
k = 3, what is the output of the function kthSmallest(root, 3)?
5
/ \
3 7
/ \ \
2 4 8
Solution
Step 1: Perform inorder traversal
Inorder traversal of BST visits nodes in ascending order: 2, 3, 4, 5, 7, 8.Step 2: Identify 3rd element in traversal
The 3rd element is 4.Final Answer:
4 -> Option BQuick Check:
Inorder 3rd element = 4 [OK]
- Counting nodes incorrectly in traversal
- Confusing preorder or postorder with inorder
- Choosing root or other node instead of kth
int count = 0;
int kthSmallest(struct Node* root, int k) {
if (!root) return -1;
int left = kthSmallest(root->left, k);
if (left != -1) return left;
count++;
if (count == k) return root->data;
return kthSmallest(root->right, k);
}
What is the main issue with this code?Solution
Step 1: Analyze use of 'count'
The variable 'count' is global and not reset between calls, causing wrong counts if function called multiple times.Step 2: Understand impact on results
Because 'count' is not reset, subsequent calls may return wrong kth smallest element or fail.Final Answer:
Global variable 'count' causes incorrect results on multiple calls -> Option AQuick Check:
Global count not reset breaks repeated calls [OK]
- Ignoring global variable side effects
- Assuming function works for multiple calls
- Not resetting count before each call
Solution
Step 1: Understand duplicates in BST
Duplicates appear as multiple nodes with same value; inorder traversal visits them in sorted order including duplicates.Step 2: Modify traversal to skip duplicates
Track previous visited value during inorder traversal; only increment count when current value differs from previous.Step 3: Find kth unique element
Increment count only for unique values; when count equals k, return current node's value.Final Answer:
Use inorder traversal and skip duplicates by comparing with previous visited value -> Option DQuick Check:
Skip duplicates by comparing previous value [OK]
- Counting duplicates as separate elements
- Using preorder traversal which is not sorted
- Trying to remove duplicates instead of skipping
Ready to prove it?
Pass the test and this pattern moves unknown
