Problem Statement
Given the root of a Binary Search Tree (BST) containing n > 1 nodes, find the minimum absolute difference between the values of any two different nodes.
Example 1
50
/ \
30 70
/ / \
20 60 80The inorder traversal is:
20 → 30 → 50 → 60 → 70 → 80The differences between adjacent values are:
30 - 20 = 10
50 - 30 = 20
60 - 50 = 10
70 - 60 = 10
80 - 70 = 10Therefore, the minimum absolute difference is:
10Key Concept
The most important property of a Binary Search Tree is:
Left subtree < Root < Right subtreeBecause of this property, an inorder traversal of a BST always produces the node values in sorted order.
For example:
BST:
50
/ \
30 70
/ / \
20 60 80
Inorder:
20 → 30 → 50 → 60 → 70 → 80Once the values are sorted, we only need to compare adjacent values.
Why?
Suppose the sorted values are:
10, 20, 25, 40The possible differences include:
20 - 10 = 10
25 - 10 = 15
40 - 10 = 30
25 - 20 = 5
40 - 20 = 20
40 - 25 = 15The minimum difference is 5, which is between adjacent values 20 and 25.
Therefore, instead of comparing every pair of nodes, we only compare each node with the previous node visited during inorder traversal.
Approach
We use inorder traversal with two variables:
prev→ stores the previous node's value.minDiff→ stores the minimum difference found so far.
Steps
Traverse the left subtree.
When visiting the current node:
If a previous value exists, calculate:
current value - previous valueUpdate
minDiff.
Store the current node's value in
prev.Traverse the right subtree.
Return
minDiff.
Java Code
class Solution {
int prev = -1;
int minDiff = Integer.MAX_VALUE;
public int absDiff(Node root) {
inorder(root);
return minDiff;
}
void inorder(Node root) {
if (root == null) {
return;
}
// Traverse left subtree
inorder(root.left);
// Compare current value with previous value
if (prev != -1) {
minDiff = Math.min(minDiff, root.data - prev);
}
// Update previous value
prev = root.data;
// Traverse right subtree
inorder(root.right);
}
}Code Explanation
1. Variables
int prev = -1;
int minDiff = Integer.MAX_VALUE;prev
prev stores the value of the previous node visited during inorder traversal.
Initially:
prev = -1Since node values are given as 0 or greater, -1 can be used to indicate that there is no previous node yet.
minDiff
We initialize minDiff with the largest possible integer value:
Integer.MAX_VALUEThis allows the first calculated difference to replace it.
2. Main Function
public int absDiff(Node root) {
inorder(root);
return minDiff;
}The absDiff() method starts the inorder traversal.
After traversal is completed, minDiff contains the smallest difference found.
3. Base Condition
if (root == null) {
return;
}If the current node is null, there is nothing to process, so we return.
This is the stopping condition for recursion.
4. Traverse Left Subtree
inorder(root.left);We first visit the left subtree.
This is important because inorder traversal follows:
Left → Root → RightFor a BST, this produces values in sorted order.
5. Calculate Difference
if (prev != -1) {
minDiff = Math.min(minDiff, root.data - prev);
}After visiting the left subtree, we process the current node.
If prev contains a valid previous value, we calculate:
current value - previous valueFor example:
Previous = 30
Current = 50
Difference = 50 - 30
= 20Then:
Math.min(minDiff, 20)keeps the smaller value.
6. Update Previous Value
prev = root.data;After processing the current node, its value becomes the previous value for the next node.
For example:
20 → 30 → 50When processing 30:
prev = 20
current = 30
difference = 10After processing:
prev = 30Then when processing 50:
prev = 30
current = 50
difference = 207. Traverse Right Subtree
inorder(root.right);Finally, we visit the right subtree.
This maintains the inorder traversal:
Left → Root → RightDry Run
Consider:
50
/ \
30 70
/ / \
20 60 80Inorder Traversal
The traversal produces:
20 → 30 → 50 → 60 → 70 → 80Now let's process each value.
Current | Previous | Difference | Minimum |
|---|---|---|---|
20 | -1 | - | MAX |
30 | 20 | 10 | 10 |
50 | 30 | 20 | 10 |
60 | 50 | 10 | 10 |
70 | 60 | 10 | 10 |
80 | 70 | 10 | 10 |
Finally:
minDiff = 10So the answer is:
10Why Don't We Compare Every Pair?
A simple approach would be to calculate the difference between every pair of nodes.
For n nodes, there can be approximately:
n × (n - 1) / 2pairs.
That results in:
O(n²)time complexity.
But the BST property gives us a better solution.
Since inorder traversal already gives sorted values:
10 → 15 → 30 → 45 → 50we only need to check:
15 - 10
30 - 15
45 - 30
50 - 45Therefore, every node is processed only once.
Why
root.data - prev Instead of Math.abs()?Normally, absolute difference is:
Math.abs(a - b)But here, inorder traversal gives values in increasing order.
Therefore:
current >= previousSo:
current - previouswill never be negative.
For example:
20 → 30 → 50 → 60The differences are:
30 - 20 = 10
50 - 30 = 20
60 - 50 = 10Thus, Math.abs() is unnecessary.
Another Example
Consider:
60
/ \
30 90
/
10Inorder traversal:
10 → 30 → 60 → 90Differences:
30 - 10 = 20
60 - 30 = 30
90 - 60 = 30Therefore:
Answer = 20Complexity Analysis
Time Complexity
O(n)Each node is visited exactly once during inorder traversal.
Auxiliary Space
O(h)where h is the height of the BST.
The space is used by the recursion stack.
For a balanced BST:
h = O(log n)For a skewed BST:
h = O(n)Therefore, the expected auxiliary space is:
O(h)Important Interview Point
Whenever you see a problem involving minimum difference between values in a BST, remember:
Inorder traversal of a BST gives sorted values.
So the general pattern is:
BST
↓
Inorder Traversal
↓
Sorted Values
↓
Compare Adjacent Values
↓
Find Minimum DifferenceThis avoids checking every possible pair and gives an efficient:
Time: O(n)
Space: O(h)solution.

Join the conversation! Your thoughts help the community grow.