BST Delete Operation in DSA C++ - Time & Space Complexity
We want to understand how long it takes to remove a value from a Binary Search Tree (BST).
Specifically, how the time changes as the tree grows bigger.
Analyze the time complexity of the following code snippet.
Node* deleteNode(Node* root, int key) {
if (!root) return nullptr;
if (key < root->val) {
root->left = deleteNode(root->left, key);
} else if (key > root->val) {
root->right = deleteNode(root->right, key);
} else {
if (!root->left) return root->right;
if (!root->right) return root->left;
Node* temp = findMin(root->right);
root->val = temp->val;
root->right = deleteNode(root->right, temp->val);
}
return root;
}
This code removes a node with a given key from a BST, adjusting links to keep the tree valid.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive calls down the tree to find the node to delete.
- How many times: At most once per tree level, moving left or right.
- Additional operation: Finding the minimum node in the right subtree (also a small recursion or loop).
As the tree grows taller, the number of steps to find and delete a node grows roughly with the tree height.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | Up to 4-5 steps (tree height) |
| 100 | Up to 7-8 steps |
| 1000 | Up to 10-11 steps |
Pattern observation: The steps grow slowly with input size if the tree is balanced, but can grow linearly if unbalanced.
Time Complexity: O(h) where h is the tree height
This means the time depends on how tall the tree is, not just how many nodes it has.
[X] Wrong: "Deleting a node always takes the same time regardless of tree shape."
[OK] Correct: If the tree is very unbalanced (like a linked list), deletion can take much longer because you must go through many nodes.
Understanding how deletion time depends on tree height helps you explain trade-offs in tree design and shows you can analyze recursive code well.
"What if the BST is always perfectly balanced? How would the time complexity change then?"
Practice
Solution
Step 1: Understand leaf node deletion
A leaf node has no children, so removing it does not affect other nodes.Step 2: Update parent's pointer
The parent's pointer to this node is set to null, effectively removing the node.Final Answer:
The node is simply removed and its parent's pointer is set to null. -> Option CQuick Check:
Leaf node deletion = remove node and nullify parent's pointer [OK]
- Thinking the tree needs full restructuring
- Replacing leaf node with children when none exist
- Confusing leaf node deletion with internal node deletion
key from a BST using a recursive function named deleteNode in C++?Solution
Step 1: Understand function signature
The function returns the new root after deletion, so assignment is needed.Step 2: Correct function call
Callingroot = deleteNode(root, key);updates the root pointer correctly.Final Answer:
root = deleteNode(root, key); -> Option DQuick Check:
Assign returned root after deletion [OK]
- Not assigning the returned root to update the tree
- Swapping argument order incorrectly
- Using method call syntax on root pointer
15 / \ 10 20 / / \ 8 17 25
root = deleteNode(root, 10);
What will be the in-order traversal of the BST after deletion?Solution
Step 1: Identify node to delete and its children
Node 10 has one child (8). Deleting 10 replaces it with 8.Step 2: Perform in-order traversal after deletion
In-order traversal visits nodes in ascending order: 8, 15, 17, 20, 25.Final Answer:
[8, 15, 17, 20, 25] -> Option BQuick Check:
In-order after deleting 10 = [8, 15, 17, 20, 25] [OK]
- Forgetting to replace node 10 with its child 8
- Including deleted node 10 in traversal
- Misordering nodes in traversal
Node* deleteNode(Node* root, int key) {
if (!root) return root;
if (key < root->val) root->left = deleteNode(root->left, key);
else if (key > root->val) root->right = deleteNode(root->right, key);
else {
if (!root->left) return root->right;
else if (!root->right) return root->left;
Node* temp = root->left; // BUG HERE
root->val = temp->val;
root->left = deleteNode(root->left, temp->val);
}
return root;
}Solution
Step 1: Identify replacement node for deletion
For nodes with two children, the inorder successor (minimum in right subtree) should replace the node.Step 2: Spot incorrect replacement
The code incorrectly uses the left child as replacement, which breaks BST properties.Final Answer:
It uses the left child instead of the inorder successor (right subtree minimum) for replacement. -> Option AQuick Check:
Use inorder successor (right subtree min) for two-child deletion [OK]
- Using left child instead of inorder successor
- Not updating pointers after replacement
- Ignoring null root check
Solution
Step 1: Identify node to delete and its children
Node 30 is root with two children: left subtree (20) and right subtree (40).Step 2: Find inorder successor to replace root
Inorder successor is the minimum node in right subtree, which is 35.Step 3: Replace root with inorder successor
Node 35 replaces 30 to maintain BST properties after deletion.Final Answer:
Node 35 (minimum node in right subtree) -> Option AQuick Check:
Root replacement = inorder successor (min right subtree) [OK]
- Replacing with left subtree max instead of right subtree min
- Replacing with direct child without checking subtree
- Confusing inorder predecessor and successor
Ready to prove it?
Pass the test and this pattern moves unknown
