logzly. Code Interview Lab

Master Binary Search Trees for Coding Interviews: A 30-Minute Hands-On Guide

Read this article in clean Markdown format for LLMs and AI context.

You’ve probably stared at a BST diagram in a textbook and thought, “When will I ever need this?” The truth is, binary search trees pop up in almost every interview that asks you to store, search, or sort data efficiently. Mastering them in half an hour can turn a vague fear into a confident answer – and that’s exactly what Code Interview Lab is all about.

What is a BST and Why It Matters

A binary search tree (BST) is a binary tree where each node follows a simple rule: every value in the left subtree is smaller than the node’s value, and every value in the right subtree is larger. This ordering lets you cut the search space in half at each step, giving you O(log n) time for look‑ups, inserts, and deletes—provided the tree stays balanced.

Why interviewers love BSTs? They are a perfect playground for testing your grasp of recursion, pointer manipulation, and algorithmic thinking, as detailed in our step‑by‑step BST guide. A clean BST implementation shows you can write code that is both correct and easy to read.

Core properties in plain language

  • Node – a container that holds a value and two child pointers (left and right).
  • Root – the topmost node; there is exactly one per tree.
  • Leaf – a node with no children.
  • Height – the longest path from root to a leaf; balanced trees keep this low.

If any of these concepts feel fuzzy, don’t worry. We’ll build a tiny BST together in the next section.

Build a BST in 5 Minutes

Grab your favorite editor and type the following Python class. (If you prefer Java or C++, the logic is identical; just swap syntax.)

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

class BST:
    def __init__(self):
        self.root = None

    def insert(self, val):
        if not self.root:
            self.root = Node(val)
            return

        cur = self.root
        while True:
            if val < cur.val:
                if cur.left:
                    cur = cur.left
                else:
                    cur.left = Node(val)
                    break
            else:  # val >= cur.val goes to the right
                if cur.right:
                    cur = cur.right
                else:
                    cur.right = Node(val)
                    break

Run a quick sanity check:

tree = BST()
for x in [7, 3, 9, 1, 5]:
    tree.insert(x)

If you print the tree in‑order (left, root, right) you’ll see the numbers come out sorted. That’s the magic of the BST property.

Common Interview Operations

Most interview problems revolve around three core operations: insert, search, and delete. Let’s add the missing pieces.

Search

def search(self, val):
    cur = self.root
    while cur:
        if val == cur.val:
            return True
        cur = cur.left if val < cur.val else cur.right
    return False

Delete

Deletion is the trickiest because you have to keep the BST rule intact. There are three cases:

  1. Node is a leaf – just remove it.
  2. Node has one child – replace the node with its child.
  3. Node has two children – find the smallest node in the right subtree (the “in‑order successor”), copy its value to the node being deleted, then delete the successor (which will be case 1 or 2).

Here’s a compact recursive version:

def delete(self, val):
    def _delete(node, val):
        if not node:
            return None
        if val < node.val:
            node.left = _delete(node.left, val)
        elif val > node.val:
            node.right = _delete(node.right, val)
        else:  # found the node
            if not node.left:
                return node.right
            if not node.right:
                return node.left
            # both children exist
            succ = node.right
            while succ.left:
                succ = succ.left
            node.val = succ.val
            node.right = _delete(node.right, succ.val)
        return node
    self.root = _delete(self.root, val)

Practice these three methods until you can write them on a whiteboard without looking at your screen. That muscle memory will pay off when the clock is ticking.

Walkthrough a Typical Interview Problem

Problem: “Given a BST, return the k‑th smallest element.”

Why this problem? It forces you to combine an in‑order traversal (which yields sorted order) with a counter, and it tests whether you can stop early instead of traversing the whole tree.

Solution sketch

  1. Perform an in‑order traversal using recursion or an explicit stack.
  2. Keep a counter that increments each time you visit a node.
  3. When the counter equals k, capture the node’s value and stop.

Code (iterative version)

def kth_smallest(self, k):
    stack = []
    cur = self.root
    while stack or cur:
        while cur:
            stack.append(cur)
            cur = cur.left
        cur = stack.pop()
        k -= 1
        if k == 0:
            return cur.val
        cur = cur.right
    raise IndexError("k is larger than the number of nodes")

A few things to note:

  • The stack mimics the call stack of a recursive solution, keeping the algorithm O(h) space where h is the tree height.
  • We stop as soon as we hit the k‑th node, so the runtime is O(k) in the worst case, but often much less.

Try it with the tree you built earlier:

print(tree.kth_smallest(3))  # should print 5 for the example set

If you can explain why the algorithm works and discuss its time/space trade‑offs, you’ve nailed a classic BST interview question.

Quick Checklist Before You Walk Into the Interview

  • Know the BST invariants – left < node < right.
  • Can write insert, search, delete from memory in both iterative and recursive styles.
  • Understand traversal orders (in‑order = sorted, pre‑order = root first, post‑order = children first).
  • Can solve “k‑th smallest”, “range sum”, and “validate BST” with one pass.
  • Know the pitfalls of an unbalanced tree – worst‑case O(n) time, and when to mention self‑balancing alternatives (AVL, Red‑Black).
  • For a broader look at how balanced structures enable high‑throughput services, see our article on designing a scalable URL shortener.
  • Practice on a whiteboard – no IDE autocomplete, just pen and paper.

When you’re comfortable with these points, you’ll feel like you own the BST topic, not just survive it.


Reactions
Do you have any feedback or ideas on how we can improve this page?