Using Inorder Traversal (BST Property) – O(n) Time and O(n) Space
The idea is to take advantage of the Binary Search Tree property where inorder traversal gives values in sorted order. Once the values are sorted, the minimum absolute difference will always be found between adjacent. So instead of comparing all pairs, we only check consecutive elements, which significantly reduces the time complexity.
Perform inorder traversal to store node values in sorted order
Traverse the sorted list and compute difference between adjacent elements
Track the minimum difference while iterating
Return the minimum difference obtained
C++
#include<bits/stdc++.h>usingnamespacestd;classNode{public:intdata;Node*left;Node*right;Node(intdata){this->data=data;left=nullptr;right=nullptr;}};// simple inorder traversal to store valuesvoidinorder(vector<int>&inord,Node*root){if(root==nullptr)return;inorder(inord,root->left);inord.push_back(root->data);inorder(inord,root->right);}// function to find minimum absolute differenceintabsDiff(Node*root){vector<int>inord;// inorder of BST gives sorted valuesinorder(inord,root);intmini=INT_MAX;intn=inord.size();// since array is sorted, just check adjacent elementsfor(inti=0;i<n-1;i++){mini=min(mini,inord[i+1]-inord[i]);}returnmini;}intmain(){Node*root=newNode(5);root->left=newNode(3);root->right=newNode(7);root->left->left=newNode(2);root->left->right=newNode(4);root->right->left=newNode(6);root->right->right=newNode(8);cout<<absDiff(root);return0;}
Java
importjava.util.*;// class for treeclassNode{intdata;Nodeleft;Noderight;Node(intdata){this.data=data;left=null;right=null;}}classGFG{// simple inorder traversal to store valuesstaticvoidinorder(List<Integer>inord,Noderoot){if(root==null)return;inorder(inord,root.left);inord.add(root.data);inorder(inord,root.right);}// function to find minimum absolute differencestaticintabsDiff(Noderoot){List<Integer>inord=newArrayList<>();// inorder of BST gives sorted valuesinorder(inord,root);intmini=Integer.MAX_VALUE;intn=inord.size();// since array is sorted, just check adjacent elementsfor(inti=0;i<n-1;i++){mini=Math.min(mini,inord.get(i+1)-inord.get(i));}returnmini;}publicstaticvoidmain(String[]args){Noderoot=newNode(5);root.left=newNode(3);root.right=newNode(7);root.left.left=newNode(2);root.left.right=newNode(4);root.right.left=newNode(6);root.right.right=newNode(8);System.out.println(absDiff(root));}}
Python
# class for treeclassNode:def__init__(self,data):self.data=dataself.left=Noneself.right=None# simple inorder traversal to store valuesdefinorder(inord,root):ifrootisNone:returninorder(inord,root.left)inord.append(root.data)inorder(inord,root.right)# function to find minimum absolute differencedefabsDiff(root):inord=[]# inorder of BST gives sorted valuesinorder(inord,root)mini=float('inf')n=len(inord)# since array is sorted, just check adjacent elementsforiinrange(n-1):mini=min(mini,inord[i+1]-inord[i])returnminiroot=Node(5)root.left=Node(3)root.right=Node(7)root.left.left=Node(2)root.left.right=Node(4)root.right.left=Node(6)root.right.right=Node(8)print(absDiff(root))
C#
usingSystem;usingSystem.Collections.Generic;// class for treeclassNode{publicintdata;publicNodeleft;publicNoderight;publicNode(intdata){this.data=data;left=null;right=null;}}classGFG{// simple inorder traversal to store valuesstaticvoidinorder(List<int>inord,Noderoot){if(root==null)return;inorder(inord,root.left);inord.Add(root.data);inorder(inord,root.right);}// function to find minimum absolute differencestaticintabsDiff(Noderoot){List<int>inord=newList<int>();// inorder of BST gives sorted valuesinorder(inord,root);intmini=int.MaxValue;intn=inord.Count;// since array is sorted, just check adjacent elementsfor(inti=0;i<n-1;i++){mini=Math.Min(mini,inord[i+1]-inord[i]);}returnmini;}staticvoidMain(){Noderoot=newNode(5);root.left=newNode(3);root.right=newNode(7);root.left.left=newNode(2);root.left.right=newNode(4);root.right.left=newNode(6);root.right.right=newNode(8);// calling functionConsole.WriteLine(absDiff(root));}}
JavaScript
// class for treeclassNode{constructor(data){this.data=data;this.left=null;this.right=null;}}// simple inorder traversal to store valuesfunctioninorder(inord,root){if(root===null)return;inorder(inord,root.left);inord.push(root.data);inorder(inord,root.right);}// function to find minimum absolute differencefunctionabsDiff(root){letinord=[];// inorder of BST gives sorted valuesinorder(inord,root);letmini=Number.MAX_SAFE_INTEGER;letn=inord.length;// since array is sorted, just check adjacent elementsfor(leti=0;i<n-1;i++){mini=Math.min(mini,inord[i+1]-inord[i]);}returnmini;}letroot=newNode(5);root.left=newNode(3);root.right=newNode(7);root.left.left=newNode(2);root.left.right=newNode(4);root.right.left=newNode(6);root.right.right=newNode(8);// calling functionconsole.log(absDiff(root));
Output
1
Using Inorder Traversal (Without Extra Space) – O(n) Time and O(h) Space
The idea is to use inorder traversal and keep track of the previously visited node during traversal. Since the values are visited in sorted order, the minimum difference will always occur between consecutive nodes.
Perform inorder traversal and maintain a pointer to the previously visited node
At each node, compute the difference with the previous node
Update the minimum difference accordingly
Continue traversal and return the final minimum difference
C++
#include<bits/stdc++.h>usingnamespacestd;// class for tree nodeclassNode{public:intdata;Node*left;Node*right;Node(intdata){this->data=data;left=nullptr;right=nullptr;}};// inorder traversal while keeping track of previous nodevoidinorder(Node*curr,Node*&prev,int&ans){// base caseif(curr==nullptr)return;// go to left subtreeinorder(curr->left,prev,ans);// process current nodeif(prev!=nullptr)ans=min(ans,curr->data-prev->data);prev=curr;// update previous node// go to right subtreeinorder(curr->right,prev,ans);}// function to find minimum absolute difference in BSTintabsDiff(Node*root){Node*prev=nullptr;intans=INT_MAX;// inorder traversal (gives sorted order)inorder(root,prev,ans);returnans;}// Driver code intmain(){Node*root=newNode(5);root->left=newNode(3);root->right=newNode(7);root->left->left=newNode(2);root->left->right=newNode(4);root->right->left=newNode(6);root->right->right=newNode(8);cout<<absDiff(root);return0;}
Java
importjava.util.*;// class for tree nodeclassNode{intdata;Nodeleft;Noderight;Node(intdata){this.data=data;left=null;right=null;}}classGFG{// inorder traversal while keeping track of previous nodestaticvoidinorder(Nodecurr,Node[]prev,int[]ans){// base caseif(curr==null)return;// go to left subtreeinorder(curr.left,prev,ans);// process current nodeif(prev[0]!=null)ans[0]=Math.min(ans[0],curr.data-prev[0].data);prev[0]=curr;// update previous node// go to right subtreeinorder(curr.right,prev,ans);}// function to find minimum absolute difference in BSTstaticintabsDiff(Noderoot){Node[]prev=newNode[1];int[]ans=newint[]{Integer.MAX_VALUE};// inorder traversal (gives sorted order)inorder(root,prev,ans);returnans[0];}// Driver code publicstaticvoidmain(String[]args){Noderoot=newNode(5);root.left=newNode(3);root.right=newNode(7);root.left.left=newNode(2);root.left.right=newNode(4);root.right.left=newNode(6);root.right.right=newNode(8);System.out.println(absDiff(root));}}
Python
# class for tree nodeclassNode:def__init__(self,data):self.data=dataself.left=Noneself.right=None# inorder traversal while keeping track of previous nodedefinorder(curr,prev,ans):# base caseifcurrisNone:return# go to left subtreeinorder(curr.left,prev,ans)# process current nodeifprev[0]isnotNone:ans[0]=min(ans[0],curr.data-prev[0].data)prev[0]=curr# update previous node# go to right subtreeinorder(curr.right,prev,ans)# function to find minimum absolute difference in BSTdefabsDiff(root):prev=[None]ans=[float('inf')]# inorder traversal (gives sorted order)inorder(root,prev,ans)returnans[0]# Driver coderoot=Node(5)root.left=Node(3)root.right=Node(7)root.left.left=Node(2)root.left.right=Node(4)root.right.left=Node(6)root.right.right=Node(8)print(absDiff(root))
C#
usingSystem;// class for tree nodeclassNode{publicintdata;publicNodeleft;publicNoderight;publicNode(intdata){this.data=data;left=null;right=null;}}classGFG{// inorder traversal while keeping track of previous nodestaticvoidinorder(Nodecurr,refNodeprev,refintans){// base caseif(curr==null)return;// go to left subtreeinorder(curr.left,refprev,refans);// process current nodeif(prev!=null)ans=Math.Min(ans,curr.data-prev.data);prev=curr;// update previous node// go to right subtreeinorder(curr.right,refprev,refans);}// function to find minimum absolute difference in BSTstaticintabsDiff(Noderoot){Nodeprev=null;intans=int.MaxValue;// inorder traversal (gives sorted order)inorder(root,refprev,refans);returnans;}// Driver code staticvoidMain(){Noderoot=newNode(5);root.left=newNode(3);root.right=newNode(7);root.left.left=newNode(2);root.left.right=newNode(4);root.right.left=newNode(6);root.right.right=newNode(8);Console.WriteLine(absDiff(root));}}
JavaScript
// class for tree NodeclassNode{constructor(data){this.data=data;this.left=null;this.right=null;}}// inorder traversal while keeping track of previous Nodefunctioninorder(curr,prev,ans){// base caseif(curr===null)return;// go to left subtreeinorder(curr.left,prev,ans);// process current Nodeif(prev.obj!==null)ans.val=Math.min(ans.val,curr.data-prev.obj.data);prev.obj=curr;// update previous Node// go to right subtreeinorder(curr.right,prev,ans);}// function to find minimum absolute difference in BSTfunctionabsDiff(root){letprev={obj:null};letans={val:Number.MAX_SAFE_INTEGER};// inorder traversal (gives sorted order)inorder(root,prev,ans);returnans.val;}// Driver code letroot=newNode(5);root.left=newNode(3);root.right=newNode(7);root.left.left=newNode(2);root.left.right=newNode(4);root.right.left=newNode(6);root.right.right=newNode(8);console.log(absDiff(root));