Kth Smallest Element in BST in DSA Go - Time & Space Complexity
We want to know how long it takes to find the kth smallest value in a Binary Search Tree (BST).
Specifically, how the time grows as the tree size or k changes.
Analyze the time complexity of the following code snippet.
func kthSmallest(root *TreeNode, k int) int {
stack := []*TreeNode{}
current := root
count := 0
for current != nil || len(stack) > 0 {
for current != nil {
stack = append(stack, current)
current = current.Left
}
current = stack[len(stack)-1]
stack = stack[:len(stack)-1]
count++
if count == k {
return current.Val
}
current = current.Right
}
return -1
}
This code finds the kth smallest element by doing an in-order traversal using a stack.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: In-order traversal visiting nodes one by one.
- How many times: Up to k nodes are visited before stopping.
As k grows, the number of nodes visited grows roughly the same.
| Input Size (n) | Approx. Operations (visits) |
|---|---|
| 10, k=3 | 3 |
| 100, k=50 | 50 |
| 1000, k=700 | 700 |
Pattern observation: The work grows linearly with k, not necessarily with total n.
Time Complexity: O(h + k)
This means the time depends on the tree height plus how many nodes we visit up to k.
[X] Wrong: "The time is always O(n) because we might visit all nodes."
[OK] Correct: We stop as soon as we find the kth smallest, so often we visit fewer than all nodes.
Understanding this helps you explain how tree structure affects search speed and shows you can analyze partial traversals.
"What if the BST is balanced vs very skewed? How would the time complexity change?"
Practice
Kth Smallest Element in BST mean?Solution
Step 1: Understand BST property
A Binary Search Tree (BST) stores elements so that left child nodes are smaller and right child nodes are larger than the parent node.Step 2: Define Kth smallest element
The Kth smallest element is the element that appears in the Kth position when all elements are sorted in ascending order.Final Answer:
The element that is the Kth smallest when BST elements are sorted in ascending order -> Option DQuick Check:
Kth smallest = Kth element in sorted order [OK]
- Confusing Kth smallest with root element
- Thinking it means largest element
- Mixing frequency with order
TreeNode?Solution
Step 1: Check parameter order and types
The function should take the root pointer of type *TreeNode and an integer k to specify the Kth element.Step 2: Check return type
The function returns an int representing the value of the Kth smallest element.Final Answer:
func kthSmallest(root *TreeNode, k int) int -> Option BQuick Check:
Correct parameters and return type [OK]
- Swapping parameter order
- Passing root by value instead of pointer
- Missing k parameter
- Wrong return type
k = 3, what will the output of kthSmallest(root, 3) be?
5
/ \
3 7
/ \ \
2 4 8
Solution
Step 1: Perform in-order traversal
In-order traversal visits nodes in ascending order: 2, 3, 4, 5, 7, 8.Step 2: Identify the 3rd element
The 3rd element in this order is 4.Final Answer:
4 -> Option AQuick Check:
In-order 3rd element = 4 [OK]
- Counting root as first without traversal
- Confusing pre-order or post-order with in-order
- Off-by-one counting errors
func kthSmallest(root *TreeNode, k int) int {
count := 0
var result int
var inorder func(node *TreeNode)
inorder = func(node *TreeNode) {
if node == nil {
return
}
inorder(node.Left)
count++
if count == k {
result = node.Val
return
}
inorder(node.Right)
}
inorder(root)
return result
}
What is the main bug in this code?Solution
Step 1: Analyze traversal stopping condition
The code sets result when count == k but does not stop further recursion, so it continues traversing unnecessarily.Step 2: Identify missing early return
After finding the Kth element, the function should stop traversing to avoid overwriting result or extra work.Final Answer:
The function does not stop traversal after finding the Kth element -> Option AQuick Check:
Traversal continues after Kth found [OK]
- Not stopping recursion after finding result
- Incorrect count increment placement
- Returning wrong variable
Solution
Step 1: Understand subtree counts
By storing the number of nodes in each subtree, we can decide if the Kth smallest is in left subtree, current node, or right subtree without full traversal.Step 2: Use counts to skip branches
If left subtree has more than or equal to k nodes, recurse left; else adjust k and recurse right, reducing unnecessary visits.Final Answer:
Store the count of nodes in each subtree and use it to skip branches -> Option CQuick Check:
Subtree counts optimize search [OK]
- Doing full traversal every time
- Converting to array wastes space/time
- Using BFS which is not sorted order
Ready to prove it?
Pass the test and this pattern moves unknown
