Bird
Raised Fist0
DSA C++programming

Kth Smallest Element in BST in DSA C++

Choose your learning style10 modes available
Mental Model
A binary search tree keeps smaller values on the left and bigger on the right, so the smallest values appear first if we look from left to right.
Analogy: Imagine a sorted bookshelf where smaller books are on the left and bigger books on the right. To find the kth smallest book, you start from the left and count until you reach the kth one.
      5
     / \
    3   7
   / \   \
  2   4   8
 ↑ (root)
Dry Run Walkthrough
Input: BST: 5 -> 3 -> 7 -> 2 -> 4 -> 8, find 3rd smallest element
Goal: Find the 3rd smallest value in the BST by visiting nodes in order
Step 1: Go left from 5 to 3
5 -> [3 ↑] -> 7 -> 2 -> 4 -> 8
Why: Left subtree has smaller values, so start there
Step 2: Go left from 3 to 2
5 -> 3 -> 7 -> [2 ↑] -> 4 -> 8
Why: Keep going left to find smallest values
Step 3: Visit 2 (1st smallest), move up to 3
5 -> [3 ↑] -> 7 -> 2 -> 4 -> 8
Why: 2 is smallest, next is parent 3
Step 4: Visit 3 (2nd smallest), go right to 4
5 -> 3 -> 7 -> 2 -> [4 ↑] -> 8
Why: After visiting 3, check right child for next smallest
Step 5: Visit 4 (3rd smallest), stop
5 -> 3 -> 7 -> 2 -> 4 -> 8
Why: Found the 3rd smallest element
Result:
2 -> 3 -> 4 -> ... (3rd smallest is 4)
Annotated Code
DSA C++
#include <iostream>
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

class Solution {
    int count = 0;
    int result = -1;

    void inorder(TreeNode* root, int k) {
        if (!root || result != -1) return; // stop if found or no node
        inorder(root->left, k); // go left to smaller values
        count++;
        if (count == k) {
            result = root->val; // found kth smallest
            return;
        }
        inorder(root->right, k); // go right to bigger values
    }

public:
    int kthSmallest(TreeNode* root, int k) {
        count = 0;
        result = -1;
        inorder(root, k);
        return result;
    }
};

int main() {
    TreeNode* root = new TreeNode(5);
    root->left = new TreeNode(3);
    root->right = new TreeNode(7);
    root->left->left = new TreeNode(2);
    root->left->right = new TreeNode(4);
    root->right->right = new TreeNode(8);

    Solution sol;
    int k = 3;
    cout << sol.kthSmallest(root, k) << "\n";
    return 0;
}
if (!root || result != -1) return; // stop if found or no node
stop traversal if no node or kth smallest found
inorder(root->left, k); // go left to smaller values
traverse left subtree first to get smaller values
count++;
increment count when visiting a node
if (count == k) { result = root->val; return; }
check if current node is kth smallest and save result
inorder(root->right, k); // go right to bigger values
traverse right subtree after left and current node
OutputSuccess
4
Complexity Analysis
Time: O(h + k) because we traverse down the tree height h and visit k nodes in order
Space: O(h) due to recursion stack for tree height h
vs Alternative: Naive approach sorts all nodes O(n log n), this uses BST property to stop early at kth node
Edge Cases
k is 1 (smallest element)
Returns the leftmost node value
DSA C++
if (count == k) { result = root->val; return; }
k equals number of nodes (largest element)
Returns the rightmost node value after full traversal
DSA C++
if (count == k) { result = root->val; return; }
k is larger than number of nodes
Returns -1 as result remains unchanged
DSA C++
if (!root || result != -1) return;
When to Use This Pattern
When asked for the kth smallest or largest in a BST, use inorder traversal because it visits nodes in sorted order.
Common Mistakes
Mistake: Not stopping traversal after finding kth smallest, causing unnecessary work
Fix: Add a check to stop recursion once kth smallest is found
Mistake: Using preorder or postorder traversal which does not guarantee sorted order
Fix: Use inorder traversal to get nodes in ascending order
Summary
Finds the kth smallest value in a binary search tree using inorder traversal.
Use when you need the kth smallest element efficiently without sorting all nodes.
The key insight is that inorder traversal of BST visits nodes in ascending order.

Practice

(1/5)
1. What does the Kth Smallest Element in BST problem ask you to find?
easy
A. The height of the Binary Search Tree
B. The element that is the Kth smallest value in the Binary Search Tree
C. The largest element in the Binary Search Tree
D. The sum of all elements in the Binary Search Tree

Solution

  1. Step 1: Understand the problem statement

    The problem asks to find the element that is the Kth smallest in the BST, meaning the element that would appear in position K if the BST elements were sorted.
  2. Step 2: Clarify what Kth smallest means in BST context

    Since BST stores elements in sorted order when traversed in-order, the Kth smallest element is the Kth element visited in an in-order traversal.
  3. Final Answer:

    The element that is the Kth smallest value in the Binary Search Tree -> Option B
  4. Quick Check:

    Kth smallest element = Kth element in in-order traversal [OK]
Hint: Think in-order traversal gives sorted order [OK]
Common Mistakes:
  • Confusing Kth smallest with Kth largest
  • Thinking it's about tree height
  • Summing elements instead of finding one
2. Which of the following C++ function signatures is correct for a function that finds the Kth smallest element in a BST node structure defined as struct TreeNode { int val; TreeNode* left; TreeNode* right; };?
easy
A. int kthSmallest(TreeNode* root, int k);
B. void kthSmallest(TreeNode root, int k);
C. int kthSmallest(TreeNode root, int* k);
D. int kthSmallest(TreeNode* root);

Solution

  1. Step 1: Check parameter types for BST traversal

    The function should receive a pointer to the root node to traverse the BST properly, so TreeNode* root is correct.
  2. Step 2: Check parameters for K value

    K is an integer input, so passing it as int k is correct. The function returns the Kth smallest value as an integer.
  3. Final Answer:

    int kthSmallest(TreeNode* root, int k); -> Option A
  4. Quick Check:

    Pointer to root + int k parameter = correct signature [OK]
Hint: Use pointer for tree root, int for K [OK]
Common Mistakes:
  • Passing root by value instead of pointer
  • Missing K parameter
  • Wrong return type or missing return
3. Consider the following BST and code snippet. What will be the output?
struct TreeNode {
  int val;
  TreeNode* left;
  TreeNode* right;
  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

int count = 0;
int result = -1;

void inorder(TreeNode* root, int k) {
  if (!root) return;
  inorder(root->left, k);
  count++;
  if (count == k) {
    result = root->val;
    return;
  }
  inorder(root->right, k);
}

int main() {
  TreeNode* root = new TreeNode(3);
  root->left = new TreeNode(1);
  root->right = new TreeNode(4);
  root->left->right = new TreeNode(2);
  inorder(root, 2);
  std::cout << result << std::endl;
  return 0;
}
medium
A. 2
B. 1
C. 3
D. 4

Solution

  1. Step 1: Perform in-order traversal on the BST

    The BST elements in in-order are visited as: 1, 2, 3, 4.
  2. Step 2: Identify the 2nd element visited

    The 1st element visited is 1, the 2nd is 2, so result will be set to 2.
  3. Final Answer:

    2 -> Option A
  4. Quick Check:

    In-order 2nd element = 2 [OK]
Hint: In-order traversal visits nodes in sorted order [OK]
Common Mistakes:
  • Confusing pre-order or post-order traversal
  • Off-by-one error in counting
  • Not stopping traversal after finding Kth element
4. The following code attempts to find the Kth smallest element in a BST but does not work correctly. What is the main issue?
int count = 0;
int result = -1;

void inorder(TreeNode* root, int k) {
  if (!root) return;
  inorder(root->left, k);
  if (count == k) {
    result = root->val;
    return;
  }
  count++;
  inorder(root->right, k);
}
medium
A. The function uses global variables which is not allowed
B. The function does not handle null root correctly
C. The result variable is not updated inside the function
D. The check for count == k is before incrementing count, so it misses the Kth element

Solution

  1. Step 1: Analyze the order of count checks and increments

    The code checks if count == k before incrementing count, so it skips setting result when count reaches k.
  2. Step 2: Understand impact on finding Kth element

    Because count is checked before increment, the Kth element is never assigned to result, causing incorrect behavior.
  3. Final Answer:

    The check for count == k is before incrementing count, so it misses the Kth element -> Option D
  4. Quick Check:

    Check count after increment, not before [OK]
Hint: Increment count before checking if equals K [OK]
Common Mistakes:
  • Checking count before incrementing
  • Ignoring early return after finding Kth element
  • Assuming global variables cause error
5. You want to find the Kth smallest element in a BST efficiently without using extra space for storing all elements. Which approach is best and why? A) Perform an in-order traversal and store all elements in a vector, then return the Kth element. B) Use a recursive in-order traversal with a counter to stop once the Kth element is found. C) Convert the BST to a sorted array using any traversal and then binary search for the Kth element. D) Use a breadth-first traversal and count nodes until K is reached.
hard
A. Store all elements then pick Kth; uses extra space
B. Convert to array then binary search; unnecessary overhead
C. Recursive in-order traversal with counter; stops early
D. Breadth-first traversal; does not guarantee sorted order

Solution

  1. Step 1: Evaluate space and time efficiency of each approach

    Store all elements then pick Kth; uses extra space to store all elements, which is not efficient. Convert to array then binary search; unnecessary overhead also uses extra space and unnecessary binary search. Breadth-first traversal; does not guarantee sorted order, so it won't find the Kth smallest correctly.
  2. Step 2: Identify the best approach

    Recursive in-order traversal with counter; stops early uses recursive in-order traversal which visits nodes in sorted order and stops once the Kth element is found, saving time and space.
  3. Final Answer:

    Recursive in-order traversal with counter; stops early -> Option C
  4. Quick Check:

    In-order traversal + early stop = efficient Kth smallest [OK]
Hint: Use in-order traversal with counter and stop early [OK]
Common Mistakes:
  • Using extra space unnecessarily
  • Using traversal that doesn't preserve order
  • Not stopping traversal after finding Kth element
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard