/* C++ program to find Inorder successor in a BST */ | |
#include<iostream> | |
using namespace std; | |
struct Node { | |
int data; | |
struct Node *left; | |
struct Node *right; | |
}; | |
//Function to find some data in the tree | |
Node* Find(Node*root, int data) { | |
if(root == NULL) return NULL; | |
else if(root->data == data) return root; | |
else if(root->data < data) return Find(root->right,data); | |
else return Find(root->left,data); | |
} | |
//Function to find Node with minimum value in a BST | |
struct Node* FindMin(struct Node* root) { | |
if(root == NULL) return NULL; | |
while(root->left != NULL) | |
root = root->left; | |
return root; | |
} | |
//Function to find Inorder Successor in a BST | |
struct Node* Getsuccessor(struct Node* root,int data) { | |
// Search the Node - O(h) | |
struct Node* current = Find(root,data); | |
if(current == NULL) return NULL; | |
if(current->right != NULL) { //Case 1: Node has right subtree | |
return FindMin(current->right); // O(h) | |
} | |
else { //Case 2: No right subtree - O(h) | |
struct Node* successor = NULL; | |
struct Node* ancestor = root; | |
while(ancestor != current) { | |
if(current->data < ancestor->data) { | |
successor = ancestor; // so far this is the deepest node for which current node is in left | |
ancestor = ancestor->left; | |
} | |
else | |
ancestor = ancestor->right; | |
} | |
return successor; | |
} | |
} | |
//Function to visit nodes in Inorder | |
void Inorder(Node *root) { | |
if(root == NULL) return; | |
Inorder(root->left); //Visit left subtree | |
printf("%d ",root->data); //Print data | |
Inorder(root->right); // Visit right subtree | |
} | |
// Function to Insert Node in a Binary Search Tree | |
Node* Insert(Node *root,char data) { | |
if(root == NULL) { | |
root = new Node(); | |
root->data = data; | |
root->left = root->right = NULL; | |
} | |
else if(data <= root->data) | |
root->left = Insert(root->left,data); | |
else | |
root->right = Insert(root->right,data); | |
return root; | |
} | |
int main() { | |
/*Code To Test the logic | |
Creating an example tree | |
5 | |
/ \ | |
3 10 | |
/ \ \ | |
1 4 11 | |
*/ | |
Node* root = NULL; | |
root = Insert(root,5); root = Insert(root,10); | |
root = Insert(root,3); root = Insert(root,4); | |
root = Insert(root,1); root = Insert(root,11); | |
//Print Nodes in Inorder | |
cout<<"Inorder Traversal: "; | |
Inorder(root); | |
cout<<"\n"; | |
// Find Inorder successor of some node. | |
struct Node* successor = Getsuccessor(root,1); | |
if(successor == NULL) cout<<"No successor Found\n"; | |
else | |
cout<<"Successor is "<<successor->data<<"\n"; | |
} |
This comment has been minimized.
This comment has been minimized.
Yaa ur are right Anu it should be int |
This comment has been minimized.
This comment has been minimized.
Hey! |
This comment has been minimized.
This comment has been minimized.
Line 54 should be like this : |
This comment has been minimized.
This comment has been minimized.
Python version: https://github.com/rishijd/python-learning/blob/master/data-structures/trees-inorder-successor.py Even though this was created in 2014, it is so useful today. Thank you! |
This comment has been minimized.
This comment has been minimized.
shouldn't line 14 be with this greater than |
This comment has been minimized.
This comment has been minimized.
he may have written it bymistake |
This comment has been minimized.
This comment has been minimized.
A more simpler program in java which takes care of both the cases
|
This comment has been minimized.
This comment has been minimized.
No, It's right. It would be int when that function returns |
This comment has been minimized.
This comment has been minimized.
|
This comment has been minimized.
This comment has been minimized.
Is find function necessary? |
This comment has been minimized.
This comment has been minimized.
We also need to write some condition to handle the maximium element in the BST, in this case 11, if we try to find inorder successor of 11, this gives 5 as the answer. So adding 1 more if condition to the Getsuccessor() will work fine. |
This comment has been minimized.
This comment has been minimized.
Yes it should be in C++ print form |
This comment has been minimized.
This comment has been minimized.
awesome |
This comment has been minimized.
Dear Code School;
Shouldn't the data-type for "data" in Line 59, be int? Cause the struct has "data" as int.
https://gist.github.com/mycodeschool/6515e1ec66482faf9d79#file-bst_inordersuccessor_cpp-cpp-L59
Thanks,
Anu