DSA Tracker

Medium

Recover Binary Search Tree

A medium BST problem included in Striver A2Z. Below: the roles whose interviews prioritise this topic, and how to practise it.

Topic
BST
Sheets
1
Core for
2 roles
Platform
LeetCode

The problem

Given the root of a binary search tree where exactly two nodes have been swapped by mistake, recover the tree without changing its structure. Restore the BST property by swapping those two nodes back.

Example 1

Input
[1,3,null,null,2]
Output
[3,1,null,null,2]
Why
Nodes 1 and 3 are swapped. Swapping them back restores the BST.

Example 2

Input
[3,1,4,null,null,2]
Output
[2,1,4,null,null,3]
Why
Nodes 3 and 2 are swapped. Swapping them back restores the BST.

Example 3

Input
[1]
Output
[1]
Why
A single node is already a valid BST.

Constraints

  • The number of nodes is in the range [2, 104].
  • -231 <= Node.val <= 231 - 1

How to think about it

Updated 2026-09-09

An inorder traversal of a valid BST must produce strictly ascending values. When exactly two nodes are swapped, that sequence exhibits either one inversion (if the swapped nodes were adjacent in the sorted order) or two inversions (if they were separated). Catching those inversion boundaries during the traversal pinpoints both misplaced nodes without altering a single pointer.

Approaches, worst first

  1. Inorder dump and sort

    time O(n log n) · space O(n)

    Traverse inorder to extract all nodes into a list. Sort the collected values and compare against the original traversal to find the two mismatched nodes, then rewrite their values. Simple, but takes linear auxiliary space.

  2. Inorder traversal tracking drops

    time O(n) · space O(h)

    Walk inorder while maintaining a `prev` pointer. At the first dip where `prev.val > curr.val`, record `prev` as the first corrupted node and `curr` as the second. If a second dip appears, update the second node to `curr`. Swap their values at the end.

  3. Morris inorder traversalWrite this one

    time O(n) · space O(1)

    Thread predecessor pointers to traverse inorder in O(1) auxiliary space while applying the same two-drop detection rule. Restores all tree threads on the fly and finishes with a single value swap between the two identified nodes.

Where people lose marks · 2
  • Adjacent swap trap. When adjacent elements are swapped, there is only one inversion where `prev.val > curr.val`. Forgetting to initialize the second node on the first inversion leaves the second target unset.
  • Mutating structural pointers instead of node values. The problem asks to restore the tree without changing its structure; swapping pointers invites circular references.

The theory behind it

BST — the ground this problem stands on. All BST problems

What BST is

A binary search tree is a binary tree that enforces a strict ordering rule at every node. Every value stored in a node's left branch must be smaller than the node itself, and every value in its right branch must be larger. Because this rule holds true everywhere down the tree, searching for a value does not require checking every branch. At each step, a single comparison lets you discard an entire half of the remaining nodes.

When to reach for it

Reach for a binary search tree when problems mention sorted tree structures, finding the kth smallest element, checking tree validity, or searching within a range of values. Signals include queries for the next greater element in a dynamic set, finding the lowest common ancestor in a sorted tree, or converting sorted arrays into height-balanced trees. When data must remain sorted while supporting continuous insertions and lookups, BST properties are the target.

How the pattern works

Use the ordering property to prune entire subtrees. When looking for a key, move left if the target is smaller than the current node, or move right if it is larger, stopping when values match or when reaching a null link. For validating a tree, do not merely compare a node to its immediate children; pass valid lower and upper value bounds down through recursive calls. Walking a valid binary search tree in-order visits all values in strictly increasing numerical order.

What each operation costs

OperationTime
search, insert, or delete on balanced treeO(log n)
search, insert, or delete on degenerate line treeO(n)
in-order traversal visiting all nodes in sorted orderO(n)
What usually goes wrong with BST
  • Validating a tree by checking only immediate children against the parent, missing violations where a node deep in the left subtree is larger than an ancestor higher up.
  • Allowing duplicate values on the wrong side when the problem specification requires strictly smaller values on the left and strictly greater on the right.
  • Deleting a node with two children by removing it directly instead of replacing its value with its in-order predecessor or successor and deleting that leaf instead.

Which roles need this problem

BST is a core topic for these 2 roles — if you're targeting one of them, this problem is early in your path, not optional.

Secondary for 6 more roles, including Full-Stack Developer, Android Developer, iOS Developer.

Track this in your role's order

Pick your target role and all 370 problems — including this one — resequence to what that interview actually asks. Free.

Start free

More BST problems

Problem set and role mapping as of .