Bird
Raised Fist0
DSA Typescriptprogramming

Kth Smallest Element in BST in DSA Typescript

Choose your learning style10 modes available
Mental Model
A binary search tree keeps smaller values on the left and bigger on the right. To find the kth smallest, we visit nodes in order from smallest to largest.
Analogy: Imagine a library where books are arranged from left to right by their size. To find the kth smallest book, you start from the smallest on the left and count until you reach the kth one.
      5
     / \
    3   7
   / \   \
  2   4   8
 ↑
Dry Run Walkthrough
Input: BST: 5 -> 3 -> 7 -> 2 -> 4 -> 8, find 3rd smallest element
Goal: Find the 3rd smallest value in the BST
Step 1: Start in-order traversal at root (5), move left to 3
2 -> 3 -> 4 -> 5 -> 7 -> 8
[curr at 3]
Why: Left subtree has smaller values, so we start there to find smallest elements first
Step 2: Move left from 3 to 2, visit 2 (1st smallest)
2 -> [count=1] -> 3 -> 4 -> 5 -> 7 -> 8
Why: 2 is the smallest node, so count 1 here
Step 3: Back to 3, visit 3 (2nd smallest)
2 -> 3 -> [count=2] -> 4 -> 5 -> 7 -> 8
Why: After 2, 3 is next smallest
Step 4: Move right from 3 to 4, visit 4 (3rd smallest)
2 -> 3 -> 4 -> [count=3] -> 5 -> 7 -> 8
Why: 4 is the next smallest, so we found the 3rd smallest
Result:
2 -> 3 -> 4 -> 5 -> 7 -> 8
3rd smallest element is 4
Annotated Code
DSA Typescript
class TreeNode {
  val: number;
  left: TreeNode | null;
  right: TreeNode | null;
  constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
    this.val = val === undefined ? 0 : val;
    this.left = left === undefined ? null : left;
    this.right = right === undefined ? null : right;
  }
}

function kthSmallest(root: TreeNode | null, k: number): number {
  let count = 0;
  let result = -1;

  function inorder(node: TreeNode | null) {
    if (node === null || result !== -1) return;
    inorder(node.left); // traverse left subtree
    count++;
    if (count === k) {
      result = node.val; // found kth smallest
      return;
    }
    inorder(node.right); // traverse right subtree
  }

  inorder(root);
  return result;
}

// Driver code
const root = new TreeNode(5,
  new TreeNode(3,
    new TreeNode(2),
    new TreeNode(4)
  ),
  new TreeNode(7,
    null,
    new TreeNode(8)
  )
);
const k = 3;
console.log(kthSmallest(root, k));
if (node === null || result !== -1) return;
stop traversal if node is null or kth smallest already found
inorder(node.left); // traverse left subtree
visit left subtree first to get smaller values
count++;
increment count when visiting a node
if (count === k) { result = node.val; return; }
when count matches k, record result and stop
inorder(node.right); // traverse right subtree
visit right subtree after 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 collects all nodes then sorts O(n log n), this uses BST property to do partial traversal O(h + k)
Edge Cases
k is 1 (smallest element)
Returns the smallest node value by visiting leftmost node
DSA Typescript
if (count === k) { result = node.val; return; }
k equals number of nodes (largest element)
Returns largest node value after full in-order traversal
DSA Typescript
if (count === k) { result = node.val; return; }
Empty tree (root is null)
Returns -1 as no nodes exist
DSA Typescript
if (node === null || result !== -1) return;
When to Use This Pattern
When asked for kth smallest or kth largest in a BST, use in-order 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 (result !== -1)
Mistake: Using pre-order or post-order traversal which does not guarantee sorted order
Fix: Use in-order traversal to visit nodes in ascending order
Summary
Finds the kth smallest element in a binary search tree using in-order traversal.
Use when you need the kth smallest value without sorting all nodes explicitly.
In-order traversal visits nodes in ascending order, so counting nodes visited gives the kth smallest.

Practice

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

Solution

  1. Step 1: Understand the BST property

    A Binary Search Tree (BST) stores values so that left child nodes are smaller and right child nodes are larger than the parent.
  2. Step 2: Define the Kth smallest element

    The Kth smallest element is the element that would appear in position K if all elements were sorted in ascending order.
  3. Final Answer:

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

    Kth smallest means sorted order position K [OK]
Hint: Remember BST in-order traversal gives sorted order [OK]
Common Mistakes:
  • Confusing Kth smallest with largest element
  • Thinking it means tree height
  • Counting nodes instead of values
2. Which TypeScript function signature correctly represents a function to find the Kth smallest element in a BST node structure?
easy
A. function kthSmallest(k: number, root: TreeNode): void
B. function kthSmallest(root: TreeNode | null, k: number): number
C. function kthSmallest(root: TreeNode, k: string): string
D. function kthSmallest(root: TreeNode, k: number): TreeNode

Solution

  1. Step 1: Check parameter types and order

    The function should take the root node (which can be null) and a number k representing the position.
  2. Step 2: Check return type

    The function returns the value (number) of the Kth smallest element, not a node or void.
  3. Final Answer:

    function kthSmallest(root: TreeNode | null, k: number): number -> Option B
  4. Quick Check:

    Correct parameter types and return number [OK]
Hint: Root node first, k as number, return value number [OK]
Common Mistakes:
  • Swapping parameter order
  • Using wrong return type
  • Using string instead of number for k
3. Given the BST below and k = 3, what is the output of the function kthSmallest(root, 3)?

BST structure:
5
/ \
3 7
/ \ \
2 4 8
medium
A. 3
B. 5
C. 4
D. 7

Solution

  1. Step 1: Perform in-order traversal

    In-order traversal visits nodes in ascending order: 2, 3, 4, 5, 7, 8.
  2. Step 2: Identify the 3rd element

    The 3rd element in this order is 4.
  3. Final Answer:

    4 -> Option C
  4. Quick Check:

    In-order 3rd element = 4 [OK]
Hint: In-order traversal gives sorted nodes; pick Kth [OK]
Common Mistakes:
  • Counting root as first without traversal
  • Confusing left and right subtree order
  • Picking value by node depth
4. Consider this TypeScript code snippet to find the Kth smallest element in a BST:
function kthSmallest(root: TreeNode | null, k: number): number {
  let count = 0;
  let result = -1;
  function inorder(node: TreeNode | null) {
    if (!node) return;
    inorder(node.left);
    count++;
    if (count === k) {
      result = node.val;
      return;
    }
    inorder(node.right);
  }
  inorder(root);
  return result;
}

What is the main problem with this code?
medium
A. The function does not stop traversal after finding the Kth element
B. The count variable is not incremented correctly
C. The result variable is initialized incorrectly
D. The function does not handle null root

Solution

  1. Step 1: Analyze traversal stopping condition

    The code sets result when count equals k but does not stop further recursion, so it continues traversing unnecessarily.
  2. Step 2: Understand impact of not stopping traversal

    Without stopping, the function wastes time and may overwrite result if not careful.
  3. Final Answer:

    The function does not stop traversal after finding the Kth element -> Option A
  4. Quick Check:

    Traversal must stop after Kth element found [OK]
Hint: Stop recursion immediately after finding Kth element [OK]
Common Mistakes:
  • Assuming return stops all recursion
  • Not using a flag to stop traversal
  • Ignoring null root case
5. You want to find the Kth smallest element in a BST but the tree is very large and you need to optimize for multiple queries with different K values. Which approach is best?
hard
A. Perform in-order traversal each time for every K query
B. Use breadth-first search to find the Kth smallest element
C. Randomly pick nodes until Kth smallest is found
D. Store the in-order traversal result in an array once, then answer queries by indexing

Solution

  1. Step 1: Consider repeated queries

    Performing in-order traversal each time is costly for large trees and many queries.
  2. Step 2: Use pre-processing for efficiency

    Storing the sorted elements from one in-order traversal allows O(1) access for each Kth smallest query.
  3. Step 3: Evaluate other options

    Breadth-first search does not give sorted order; random picking is inefficient and unreliable.
  4. Final Answer:

    Store the in-order traversal result in an array once, then answer queries by indexing -> Option D
  5. Quick Check:

    Precompute once, query fast [OK]
Hint: Precompute sorted list once for fast multiple queries [OK]
Common Mistakes:
  • Recomputing traversal for each query
  • Using BFS which is unsorted
  • Random selection guessing
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