// C++ program to find predecessor // and successor in a BST #include using namespace std; // BST Node struct Node { int key; struct Node *left, *right; }; // Function that finds predecessor and successor of key in BST. void findPreSuc(Node* root, Node*& pre, Node*& suc, int key) { if (root == NULL) return; // Search for given key in BST. while (root != NULL) { // If root is given key. if (root->key == key) { // the minimum value in right subtree // is predecessor. if (root->right) { suc = root->right; while (suc->left) suc = suc->left; } // the maximum value in left subtree // is successor. if (root->left) { pre = root->left; while (pre->right) pre = pre->right; } return; } // If key is greater than root, then // key lies in right subtree. Root // could be predecessor if left // subtree of key is null. else if (root->key < key) { pre = root; root = root->right; } // If key is smaller than root, then // key lies in left subtree. Root // could be successor if right // subtree of key is null. else { suc = root; root = root->left; } } } // A utility function to create a new BST node Node* newNode(int item) { Node* temp = new Node; temp->key = item; temp->left = temp->right = NULL; return temp; } // A utility function to insert // a new node with given key in BST Node* insert(Node* node, int key) { if (node == NULL) return newNode(key); if (key < node->key) node->left = insert(node->left, key); else node->right = insert(node->right, key); return node; } // Driver program to test above function int main() { int key = 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 << "-1"; if (suc != NULL) cout << "Successor is " << suc->key; else cout << "-1"; return 0; }