There is BST given with root node with key part as integer only. The structure of each node is as follows:
C++
structNode
{
intkey;
structNode *left, *right ;
};
Java
staticclassNode
{
intkey;
Node left, right ;
};
// This code is contributed by gauravrajput1
Python3
classNode:
def__init__(self, key):
self.key =key
self.left =None
self.right =None
# This code is contributed by harshitkap00r
C#
publicclassNode
{
publicintkey;
publicNode left, right ;
};
// This code is contributed by gauravrajput1
Javascript
<script>
class Node {
constructor() {
this.key = 0;
this.left = null;
this.right = null;
}
}
</script>
You need to find the inorder successor and predecessor of a given key. In case the given key is not found in BST, then return the two values within which this key will lie.
Following is the algorithm to reach the desired result. It is a recursive method:
Input: root node, key
output: predecessor node, successor node
1. If root is NULL
then return
2. if key is found then
a. If its left subtree is not null
Then predecessor will be the right most
child of left subtree or left child itself.
b. If its right subtree is not null
The successor will be the left most child
of right subtree or right child itself.
return
3. If key is smaller than root node
set the successor as root
search recursively into left subtree
else
set the predecessor as root
search recursively into right subtree
Following is the implementation of the above algorithm:
C++
// C++ program to find predecessor and successor in a BST
#include <iostream>
usingnamespacestd;
// BST Node
structNode
{
intkey;
structNode *left, *right;
};
// This function finds predecessor and successor of key in BST.
// It sets pre and suc as predecessor and successor respectively
// the maximum value in left subtree is predecessor
if(root->left != NULL)
{
Node* tmp = root->left;
while(tmp->right)
tmp = tmp->right;
pre = tmp ;
}
// the minimum value in right subtree is successor
if(root->right != NULL)
{
Node* tmp = root->right ;
while(tmp->left)
tmp = tmp->left ;
suc = tmp ;
}
return;
}
// If key is smaller than root's key, go to left subtree
if(root->key > key)
{
suc = root ;
findPreSuc(root->left, pre, suc, key) ;
}
else// go to right subtree
{
pre = root ;
findPreSuc(root->right, pre, suc, key) ;
}
}
// A utility function to create a new BST node
Node *newNode(intitem)
{
Node *temp = newNode;
temp->key = item;
temp->left = temp->right = NULL;
returntemp;
}
/* A utility function to insert a new node with given key in BST */
Node* insert(Node* node, intkey)
{
if(node == NULL) returnnewNode(key);
if(key < node->key)
node->left = insert(node->left, key);
else
node->right = insert(node->right, key);
returnnode;
}
// Driver program to test above function
intmain()
{
intkey = 65; //Key to be searched in BST
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80 */
Node *root = NULL;
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
Node* pre = NULL, *suc = NULL;
findPreSuc(root, pre, suc, key);
if(pre != NULL)
cout << "Predecessor is "<< pre->key << endl;
else
cout << "No Predecessor";
if(suc != NULL)
cout << "Successor is "<< suc->key;
else
cout << "No Successor";
return0;
}
Java
// Java program to find predecessor
// and successor in a BST
classGFG{
// BST Node
staticclassNode
{
intkey;
Node left, right;
publicNode()
{}
publicNode(intkey)
{
this.key = key;
this.left = this.right = null;
}
};
staticNode pre = newNode(), suc = newNode();
// This function finds predecessor and
// successor of key in BST. It sets pre
// and suc as predecessor and successor
// respectively
staticvoidfindPreSuc(Node root, intkey)
{
// Base case
if(root == null)
return;
// If key is present at root
if(root.key == key)
{
// The maximum value in left
// subtree is predecessor
if(root.left != null)
{
Node tmp = root.left;
while(tmp.right != null)
tmp = tmp.right;
pre = tmp;
}
// The minimum value in
// right subtree is successor
if(root.right != null)
{
Node tmp = root.right;
while(tmp.left != null)
tmp = tmp.left;
suc = tmp;
}
return;
}
// If key is smaller than
// root's key, go to left subtree
if(root.key > key)
{
suc = root;
findPreSuc(root.left, key);
}
// Go to right subtree
else
{
pre = root;
findPreSuc(root.right, key);
}
}
// A utility function to insert a
// new node with given key in BST
staticNode insert(Node node, intkey)
{
if(node == null)
returnnewNode(key);
if(key < node.key)
node.left = insert(node.left, key);
else
node.right = insert(node.right, key);
returnnode;
}
// Driver code
publicstaticvoidmain(String[] args)
{
// Key to be searched in BST
intkey = 65;
/*
* Let us create following BST
* 50
* / \
* 30 70
* / \ / \
* 20 40 60 80
*/
Node root = newNode();
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
findPreSuc(root, key);
if(pre != null)
System.out.println("Predecessor is "+ pre.key);
else
System.out.println("No Predecessor");
if(suc != null)
System.out.println("Successor is "+ suc.key);
else
System.out.println("No Successor");
}
}
// This code is contributed by sanjeev2552
Python
# Python program to find predecessor and successor in a BST
# A BST node
classNode:
# Constructor to create a new node
def__init__(self, key):
self.key =key
self.left =None
self.right =None
# This function finds predecessor and successor of key in BST
# It sets pre and suc as predecessor and successor respectively
deffindPreSuc(root, key):
# Base Case
ifroot isNone:
return
# If key is present at root
ifroot.key ==key:
# the maximum value in left subtree is predecessor
ifroot.left isnotNone:
tmp =root.left
while(tmp.right):
tmp =tmp.right
findPreSuc.pre =tmp
# the minimum value in right subtree is successor
ifroot.right isnotNone:
tmp =root.right
while(tmp.left):
tmp =tmp.left
findPreSuc.suc =tmp
return
# If key is smaller than root's key, go to left subtree
ifroot.key > key :
findPreSuc.suc =root
findPreSuc(root.left, key)
else: # go to right subtree
findPreSuc.pre =root
findPreSuc(root.right, key)
# A utility function to insert a new node in with given key in BST
definsert(node , key):
ifnode isNone:
returnNode(key)
ifkey < node.key:
node.left =insert(node.left, key)
else:
node.right =insert(node.right, key)
returnnode
# Driver program to test above function
key =65#Key to be searched in BST
""" Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
"""
root =None
root =insert(root, 50)
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
# Static variables of the function findPreSuc
findPreSuc.pre =None
findPreSuc.suc =None
findPreSuc(root, key)
iffindPreSuc.pre isnotNone:
print"Predecessor is", findPreSuc.pre.key
else:
print"No Predecessor"
iffindPreSuc.suc isnotNone:
print"Successor is", findPreSuc.suc.key
else:
print"No Successor"
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)
C#
// C# program to find predecessor
// and successor in a BST
usingSystem;
publicclassGFG
{
// BST Node
public
classNode
{
public
intkey;
public
Node left, right;
publicNode()
{}
publicNode(intkey)
{
this.key = key;
this.left = this.right = null;
}
};
staticNode pre = newNode(), suc = newNode();
// This function finds predecessor and
// successor of key in BST. It sets pre
// and suc as predecessor and successor
// respectively
staticvoidfindPreSuc(Node root, intkey)
{
// Base case
if(root == null)
return;
// If key is present at root
if(root.key == key)
{
// The maximum value in left
// subtree is predecessor
if(root.left != null)
{
Node tmp = root.left;
while(tmp.right != null)
tmp = tmp.right;
pre = tmp;
}
// The minimum value in
// right subtree is successor
if(root.right != null)
{
Node tmp = root.right;
while(tmp.left != null)
tmp = tmp.left;
suc = tmp;
}
return;
}
// If key is smaller than
// root's key, go to left subtree
if(root.key > key)
{
suc = root;
findPreSuc(root.left, key);
}
// Go to right subtree
else
{
pre = root;
findPreSuc(root.right, key);
}
}
// A utility function to insert a
// new node with given key in BST
staticNode insert(Node node, intkey)
{
if(node == null)
returnnewNode(key);
if(key < node.key)
node.left = insert(node.left, key);
else
node.right = insert(node.right, key);
returnnode;
}
// Driver code
publicstaticvoidMain(String[] args)
{
// Key to be searched in BST
intkey = 65;
/*
* Let us create following BST
* 50
* / \
* 30 70
* / \ / \
* 20 40 60 80
*/
Node root = newNode();
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
findPreSuc(root, key);
if(pre != null)
Console.WriteLine("Predecessor is "+ pre.key);
else
Console.WriteLine("No Predecessor");
if(suc != null)
Console.WriteLine("Successor is "+ suc.key);
else
Console.WriteLine("No Successor");
}
}
// This code is contributed by aashish1995
Javascript
<script>
// JavaScript program to find predecessor
// and successor in a BST// BST Node
class Node
{
constructor(key)
{
this.key = key;
this.left = this.right = null;
}
}
varpre = newNode(), suc = newNode();
// This function finds predecessor and
// successor of key in BST. It sets pre
// and suc as predecessor and successor
// respectively
functionfindPreSuc(root , key)
{
// Base case
if(root == null)
return;
// If key is present at root
if(root.key == key)
{
// The maximum value in left
// subtree is predecessor
if(root.left != null)
{
vartmp = root.left;
while(tmp.right != null)
tmp = tmp.right;
pre = tmp;
}
// The minimum value in
// right subtree is successor
if(root.right != null)
{
vartmp = root.right;
while(tmp.left != null)
tmp = tmp.left;
suc = tmp;
}
return;
}
// If key is smaller than
// root's key, go to left subtree
if(root.key > key)
{
suc = root;
findPreSuc(root.left, key);
}
// Go to right subtree
else
{
pre = root;
findPreSuc(root.right, key);
}
}
// A utility function to insert a
// new node with given key in BST
functioninsert(node , key)
{
if(node == null)
returnnewNode(key);
if(key < node.key)
node.left = insert(node.left, key);
else
node.right = insert(node.right, key);
returnnode;
}
// Driver code
// Key to be searched in BST
varkey = 65;
/*
* Let us create following BST
* 50
* / \
* 30 70
* / \ / \
* 20 40 60 80
*/
varroot = newNode();
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
findPreSuc(root, key);
if(pre != null)
document.write("Predecessor is "+ pre.key);
else
document.write("No Predecessor");
if(suc != null)
document.write("<br/>Successor is "+ suc.key);
else
document.write("<br/>No Successor");
// This code contributed by gauravrajput1
</script>
Output
Predecessor is 60
Successor is 70
Complexity Analysis:
Time Complexity: O(h), where h is the height of the tree. In the worst case as explained above we travel the whole height of the tree. Auxiliary Space: O(1), since no extra space has been taken.
Another Approach:
We can also find the inorder successor and inorder predecessor using inorder traversal. Check if the current node is smaller than the given key for the predecessor and for a successor, check if it is greater than the given key. If it is greater than the given key then, check if it is smaller than the already stored value in the successor then, update it. At last, get the predecessor and successor stored in q(successor) and p(predecessor).
Time Complexity: O(n), where n is the total number of nodes in the tree. In the worst case as explained above we travel the whole tree. Auxiliary Space: O(n).
Iterative method:
Input: root node, key output: predecessor node, successor node
set suc and pre as NULL initially.
Create a Node temp1 and set it to root node, temp1 will give the successor while traversing
In first while loop, if temp1->key>key, then temp1->key may be a successor of the key and go to the left of temp.
else, go to the right.
Create a Node temp2 and set it to root node, temp2 will give the predecessor while traversing
In second while loop, if temp2->key<key, then temp1->key may be a predecessor of the key and go to the right of temp.
else, go to the left.
Following is the implementation of the above algorithm:
C++
// C++ program to find predecessor and successor in a BST
#include <iostream>
usingnamespacestd;
// BST Node
structNode {
intkey;
structNode *left, *right;
};
// This function finds predecessor and successor of key in
// BST. It sets pre and suc as predecessor and successor
// the minimum value in right subtree is predecessor
if(temp2->key < key) {
pre = temp2;
temp2 = temp2->right;
}
else
temp2 = temp2->left;
}
return;
}
// A utility function to create a new BST node
Node* newNode(intitem)
{
Node* temp = newNode;
temp->key = item;
temp->left = temp->right = NULL;
returntemp;
}
/* A utility function to insert a new node with given key in
* BST */
Node* insert(Node* node, intkey)
{
if(node == NULL)
returnnewNode(key);
if(key < node->key)
node->left = insert(node->left, key);
else
node->right = insert(node->right, key);
returnnode;
}
// Driver program to test above function
intmain()
{
intkey = 65; // Key to be searched in BST
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80 */
Node* root = NULL;
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
Node *pre = NULL, *suc = NULL;
findPreSuc(root, pre, suc, key);
if(pre != NULL)
cout << "Predecessor is "<< pre->key << endl;
else
cout << "No Predecessor";
if(suc != NULL)
cout << "Successor is "<< suc->key;
else
cout << "No Successor";
return0;
}
//this code is contributed by Harsh Raghav
Java
// Java program to find predecessor and successor in a BST
classNode {
intkey;
Node left, right;
// BST Node
publicNode(intkey) {
this.key = key;
this.left = this.right = null;
}
}
classMain {
staticNode root;
staticNode pre, suc;
// This function finds predecessor and successor of key in
// BST. It sets pre and suc as predecessor and successor
// respectively
publicstaticvoidfindPreSuc(Node root, intkey) {
if(root == null) {
return;
}
if(root.key == key) {
// the maximum value in left subtree is predecessor
if(root.left != null) {
Node tmp = root.left;
while(tmp.right != null) {
tmp = tmp.right;
}
pre = tmp;
}
// the minimum value in right subtree is successor
if(root.right != null) {
Node tmp = root.right;
while(tmp.left != null) {
tmp = tmp.left;
}
suc = tmp;
}
return;
}
if(root.key > key) {
suc = root;
findPreSuc(root.left, key);
} else{
pre = root;
findPreSuc(root.right, key);
}
}
publicstaticNode insert(Node node, intkey) {
if(node == null) {
returnnewNode(key);
}
if(key < node.key) {
node.left = insert(node.left, key);
} else{
node.right = insert(node.right, key);
}
returnnode;
}
publicstaticvoidmain(String[] args) {
intkey = 65;
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80 */
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
pre = suc = null;
findPreSuc(root, key);
findPreSuc(root, key);
if(pre != null) {
System.out.println("Predecessor is "+ pre.key);
} else{
System.out.println("No Predecessor");
}
if(suc != null) {
System.out.println("Successor is "+ suc.key);
} else{
System.out.println("No Successor");
}
}
}
Python3
# Python program to find predecessor and successor in a BST
# BST Node
classNode:
def__init__(self, key):
self.key =key
self.left =None
self.right =None
# This function finds predecessor and successor of key in
# BST. It sets pre and suc as predecessor and successor
# respectively
deffindPreSuc(root, key):
# Base Case
ifroot isNone:
return
# If key is present at root
ifroot.key ==key:
# the maximum value in left subtree is predecessor
ifroot.left isnotNone:
tmp =root.left
while(tmp.right):
tmp =tmp.right
findPreSuc.pre =tmp
# the minimum value in right subtree is successor
ifroot.right isnotNone:
tmp =root.right
while(tmp.left):
tmp =tmp.left
findPreSuc.suc =tmp
return
# If key is smaller than root's key
# value then it could be in left subtree
ifroot.key > key:
findPreSuc.suc =root
findPreSuc(root.left, key)
else: # else it can only be in right subtree
findPreSuc.pre =root
findPreSuc(root.right, key)
# A utility function to create a new BST node
defnewNode(item):
returnNode(item)
# A utility function to insert a new node with given key in BST
definsert(node, key):
ifnode isNone:
returnnewNode(key)
ifkey < node.key:
node.left =insert(node.left, key)
else:
node.right =insert(node.right, key)
returnnode
# Driver program to test above function
defmain():
key =65# Key to be searched in BST
""" Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80
"""
root =None
root =insert(root, 50)
insert(root, 30)
insert(root, 20)
insert(root, 40)
insert(root, 70)
insert(root, 60)
insert(root, 80)
findPreSuc.pre =None
findPreSuc.suc =None
findPreSuc(root, key)
iffindPreSuc.pre isnotNone:
print("Predecessor is", findPreSuc.pre.key)
else:
print("No Predecessor")
iffindPreSuc.suc isnotNone:
print("Successor is", findPreSuc.suc.key)
else:
print("No Successor")
main()
# This code is contributed by vikramshirsath177.
C#
// C# program to find predecessor and successor in a BST
publicclassNode {
publicintkey;
publicNode left, right;
// BST Node
publicNode(intkey) {
this.key = key;
this.left = this.right = null;
}
}
publicclassProgram {
staticNode root;
staticNode pre, suc;
// This function finds predecessor and successor of key in
// BST. It sets pre and suc as predecessor and successor
// respectively
publicstaticvoidfindPreSuc(Node root, intkey) {
if(root == null) {
return;
}
if(root.key == key) {
// the maximum value in left subtree is predecessor
if(root.left != null) {
Node tmp = root.left;
while(tmp.right != null) {
tmp = tmp.right;
}
pre = tmp;
}
// the minimum value in right subtree is successor
if(root.right != null) {
Node tmp = root.right;
while(tmp.left != null) {
tmp = tmp.left;
}
suc = tmp;
}
return;
}
if(root.key > key) {
suc = root;
findPreSuc(root.left, key);
} else{
pre = root;
findPreSuc(root.right, key);
}
}
publicstaticNode insert(Node node, intkey) {
if(node == null) {
returnnewNode(key);
}
if(key < node.key) {
node.left = insert(node.left, key);
} else{
node.right = insert(node.right, key);
}
returnnode;
}
publicstaticvoidMain() {
intkey = 65;
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80 */
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
pre = suc = null;
findPreSuc(root, key);
findPreSuc(root, key);
if(pre != null) {
System.Console.WriteLine("Predecessor is "+ pre.key);
} else{
System.Console.WriteLine("No Predecessor");
}
if(suc != null) {
System.Console.WriteLine("Successor is "+ suc.key);
} else{
System.Console.WriteLine("No Successor");
}
}
}
// This code is contributed by surajrasr7277.
Javascript
// Javascript program to find predecessor and successor in a BST
// BST Node
class Node {
constructor(key) {
this.key = key;
this.left = null;
this.right = null;
}
}
// This function finds predecessor and successor of key in
// BST. It sets pre and suc as predecessor and successor
// respectively
functionfindPreSuc(root, pre, suc, key) {
// set pre and suc as NULL initially
pre = null;
suc = null;
// set temp node as root
let temp1 = root;
while(temp1) {
// the maximum value in left subtree is successor
if(temp1.key > key) {
suc = temp1;
temp1 = temp1.left;
}
else
temp1 = temp1.right;
}
let temp2 = root;
while(temp2) {
// the minimum value in right subtree is predecessor
if(temp2.key < key) {
pre = temp2;
temp2 = temp2.right;
}
else
temp2 = temp2.left;
}
return;
}
// A utility function to create a new BST node
functionnewNode(item) {
let temp = newNode(item);
returntemp;
}
/* A utility function to insert a new node with given key in
* BST */
functioninsert(node, key) {
if(node == null)
returnnewNode(key);
if(key < node.key)
node.left = insert(node.left, key);
else
node.right = insert(node.right, key);
returnnode;
}
// Driver program to test above function
let key = 65; // Key to be searched in BST
/* Let us create following BST
50
/ \
30 70
/ \ / \
20 40 60 80 */
let root = null;
root = insert(root, 50);
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
let pre = null, suc = null;
findPreSuc(root, pre, suc, key);
if(pre != null)
console.log(`Predecessor is ${pre.key}`);
else
console.log("No Predecessor");
if(suc != null)
console.log(`Successor is ${suc.key}`);
else
console.log("No Successor");
// This code is contributed by factworx412
Output
Predecessor is 60
Successor is 70
Complexity Analysis:
Time Complexity: O(n), where n is the total number of nodes in the tree. In the worst case as explained above we travel the whole tree. Auxiliary Space: O(1).
?list=PLqM7alHXFySHCXD7r1J0ky9Zg_GBB1dbk
This article is contributed by algoLover. Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
We use cookies to ensure you have the best browsing experience on our website. By using our site, you
acknowledge that you have read and understood our
Cookie Policy &
Privacy Policy
Improvement
This article is being improved by another user right now. You can suggest the changes for now and it will be under the article’s discussion tab.
You will be notified via email once the article is available for improvement.
Thank you for your valuable feedback!
Please Login to comment...