BST Inorder Successor in DSA C - Time & Space Complexity
We want to understand how long it takes to find the next bigger value in a Binary Search Tree (BST).
How does the time grow as the tree gets bigger?
Analyze the time complexity of the following code snippet.
// Find inorder successor in BST
Node* inorderSuccessor(Node* root, Node* p) {
if (p->right != NULL) {
Node* curr = p->right;
while (curr->left != NULL) {
curr = curr->left;
}
return curr;
}
Node* succ = NULL;
while (root != NULL) {
if (p->val < root->val) {
succ = root;
root = root->left;
} else {
root = root->right;
}
}
return succ;
}
This code finds the next bigger node after a given node in a BST.
Look for loops or repeated steps.
- Primary operation: Traversing down the tree nodes either to the left or right.
- How many times: At most once down a path from root or from the right child of the node.
The time depends on the height of the tree, not the total number of nodes.
| Input Size (n) | Approx. Operations (height h) |
|---|---|
| 10 | Up to 4-5 steps (if tree is balanced) |
| 100 | Up to 7 steps |
| 1000 | Up to 10 steps |
Pattern observation: Operations grow slowly as tree height grows, usually about log n steps.
Time Complexity: O(h)
This means the time to find the successor grows with the tree height, which is usually much smaller than total nodes.
[X] Wrong: "Finding the successor always takes time proportional to the total number of nodes."
[OK] Correct: We only follow one path down the tree, not visit all nodes, so time depends on height, not total nodes.
Understanding this helps you explain how tree structure affects search speed, a key skill for many coding problems.
"What if the BST is not balanced and becomes a linked list? How would the time complexity change?"
Practice
Solution
Step 1: Understand inorder traversal in BST
Inorder traversal visits nodes in ascending order of their keys.Step 2: Define inorder successor
The inorder successor of a node is the next node visited after it in inorder traversal, which is the smallest node greater than it.Final Answer:
The node with the smallest key greater than the given node's key -> Option BQuick Check:
Inorder successor = next bigger node [OK]
- Confusing successor with predecessor
- Thinking successor is always right child
- Assuming successor is left child
Solution
Step 1: Analyze function parameters
The function needs the BST root and the node to find successor for, both as pointers.Step 2: Analyze return type
It should return a pointer to the successor node, so return type is struct Node*.Final Answer:
struct Node* inorderSuccessor(struct Node* root, struct Node* n); -> Option AQuick Check:
Correct signature uses pointers for nodes [OK]
- Using int instead of struct Node*
- Missing node parameter
- Returning struct Node by value
20
/ \
10 30
\ \
15 40
Solution
Step 1: Locate node 15 and find its right subtree
Node 15 has no right child, so successor is an ancestor.Step 2: Move up to find the lowest ancestor greater than 15
Parent 10 is less than 15, move up to 20 which is greater than 15.Final Answer:
20 -> Option CQuick Check:
Next bigger after 15 is 20 [OK]
- Choosing right child 30 incorrectly
- Choosing smaller ancestor 10
- Confusing successor with predecessor
struct Node* inorderSuccessor(struct Node* root, struct Node* n) {
if (n->right != NULL) {
struct Node* temp = n->right;
while (temp->left != NULL) {
temp = temp->left;
}
return temp;
}
struct Node* succ = NULL;
while (root != NULL) {
if (n->data < root->data) {
succ = root;
root = root->left;
} else {
root = root->right;
}
}
return succ;
}
What is the main logical error in this code?Solution
Step 1: Check handling of right child
Code correctly finds leftmost node in right subtree if right child exists.Step 2: Check updating successor when moving right
In the else branch (n->data >= root->data), it incorrectly sets succ = root before moving right. Successor should NOT be updated when going right, as n is in (or at) the right subtree.Step 3: Identify error
The main logical error is incorrectly updating the successor when traversing right.Final Answer:
It incorrectly updates successor when moving right -> Option AQuick Check:
Successor updates only on left moves [OK]
- Thinking recursion is required
- Updating successor when moving right
- Ignoring right subtree case
20
/ \
10 30
/ \ / \
5 15 25 40
If the node with value 25 has no right child, what is the inorder successor and why?Solution
Step 1: Check if node 25 has right child
Node 25 has no right child, so successor is an ancestor.Step 2: Find lowest ancestor greater than 25
Ancestor 30 is greater than 25 and is the lowest such ancestor.Final Answer:
30, because it is the lowest ancestor greater than 25 -> Option DQuick Check:
Successor = nearest bigger ancestor [OK]
- Choosing right child 40 incorrectly
- Saying no successor exists
- Choosing root 20 incorrectly
Ready to prove it?
Pass the test and this pattern moves unknown
