Find Inorder successor in a BST

Run Settings
LanguageC++
Language Version
Run Command
#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 the 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) { struct Node* current = Find(root, data); //search the node O(h) 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 the left subtree cout << root->data << ", "; // visit the node Inorder(root->right); // Visit the 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() { /* 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, 10); if (successor == NULL) cout << "No successor found\n"; else cout << "Successor is " << successor->data << "\n"; return 0; }
Editor Settings
Theme
Key bindings
Full width
Lines