#include <iostream>
using namespace std;
// Data structure to store a Binary Search Tree node
struct Node {
int data;
Node *left, *right;
};
// Function to create a new binary tree node having given key
Node* newNode(int key)
{
Node* node = new Node;
node->data = key;
node->left = node->right = nullptr;
return node;
}
// Function to find Minimum value node in subtree rooted at node
int MinValue(Node* node)
{
while (node->left)
node = node->left;
return node->data;
}
// Function to find Maximum value node in subtree rooted at node
int MaxValue(Node* node)
{
while (node->right)
node = node->right;
return node->data;
}
// Recursive function to insert an key into BST
Node* insert(Node* root, int key)
{
// if the root is null, create a new node an return it
if (root == nullptr)
return newNode(key);
// if given key is less than the root node, recurse for left subtree
if (key < root->data)
root->left = insert(root->left, key);
// if given key is more than the root node, recurse for right subtree
else
root->right = insert(root->right, key);
return root;
}
// Function to find a pair with given sum in given BST
bool findPair(Node* X, Node* Y, int pair_sum, int x, int y)
{
if (X == nullptr || Y == nullptr)
return false;
// if current sum is less than the required sum, update x
if (x + y < pair_sum)
{
if (findPair(X->left, Y, pair_sum, x, y))
return true;
x = X->data;
// if current sum is equal to the required sum,
// print the pair and return true
if (x + y == pair_sum)
{
cout << "Pair found (" << x << ", " << y << ")";
return true;
}
return findPair(X->right, Y, pair_sum, x, y);
}
// if current sum is more than the required sum, update y
else if (x + y > pair_sum)
{
if (findPair(X, Y->right, pair_sum, x, y))
return true;
y = Y->data;
// if current sum is equal to the required sum,
// print the pair and return true
if (x + y == pair_sum)
{
cout << "Pair found (" << x << ", " << y << ")";
return true;
}
return findPair(X, Y->left, pair_sum, x, y);
}
}
// main function
int main()
{
int keys[] = { 7, 10, 9, 20 };
Node* root = nullptr;
for (int key : keys)
root = insert(root, key);
// given pair_sum
int pair_sum = 40;
// find Minimum and Maximum key in binary search tree
int x = MinValue(root);
int y = MaxValue(root);
if (!findPair(root, root, pair_sum, x, y))
cout << "Pair do not exists";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gRGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgYSBCaW5hcnkgU2VhcmNoIFRyZWUgbm9kZQpzdHJ1Y3QgTm9kZSB7CiAgICBpbnQgZGF0YTsKICAgIE5vZGUgKmxlZnQsICpyaWdodDsKfTsKCi8vIEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBiaW5hcnkgdHJlZSBub2RlIGhhdmluZyBnaXZlbiBrZXkKTm9kZSogbmV3Tm9kZShpbnQga2V5KQp7CiAgICBOb2RlKiBub2RlID0gbmV3IE5vZGU7CiAgICBub2RlLT5kYXRhID0ga2V5OwogICAgbm9kZS0+bGVmdCA9IG5vZGUtPnJpZ2h0ID0gbnVsbHB0cjsKCiAgICByZXR1cm4gbm9kZTsKfQoKLy8gRnVuY3Rpb24gdG8gZmluZCBNaW5pbXVtIHZhbHVlIG5vZGUgaW4gc3VidHJlZSByb290ZWQgYXQgbm9kZQppbnQgTWluVmFsdWUoTm9kZSogbm9kZSkKewogICAgd2hpbGUgKG5vZGUtPmxlZnQpCiAgICAgICAgbm9kZSA9IG5vZGUtPmxlZnQ7CgogICAgcmV0dXJuIG5vZGUtPmRhdGE7Cn0KCi8vIEZ1bmN0aW9uIHRvIGZpbmQgTWF4aW11bSB2YWx1ZSBub2RlIGluIHN1YnRyZWUgcm9vdGVkIGF0IG5vZGUKaW50IE1heFZhbHVlKE5vZGUqIG5vZGUpCnsKICAgIHdoaWxlIChub2RlLT5yaWdodCkKICAgICAgICBub2RlID0gbm9kZS0+cmlnaHQ7CgogICAgcmV0dXJuIG5vZGUtPmRhdGE7Cn0KCi8vIFJlY3Vyc2l2ZSBmdW5jdGlvbiB0byBpbnNlcnQgYW4ga2V5IGludG8gQlNUCk5vZGUqIGluc2VydChOb2RlKiByb290LCBpbnQga2V5KQp7CiAgICAvLyBpZiB0aGUgcm9vdCBpcyBudWxsLCBjcmVhdGUgYSBuZXcgbm9kZSBhbiByZXR1cm4gaXQKICAgIGlmIChyb290ID09IG51bGxwdHIpCiAgICAgICAgcmV0dXJuIG5ld05vZGUoa2V5KTsKCiAgICAvLyBpZiBnaXZlbiBrZXkgaXMgbGVzcyB0aGFuIHRoZSByb290IG5vZGUsIHJlY3Vyc2UgZm9yIGxlZnQgc3VidHJlZQogICAgaWYgKGtleSA8IHJvb3QtPmRhdGEpCiAgICAgICAgcm9vdC0+bGVmdCA9IGluc2VydChyb290LT5sZWZ0LCBrZXkpOwoKICAgIC8vIGlmIGdpdmVuIGtleSBpcyBtb3JlIHRoYW4gdGhlIHJvb3Qgbm9kZSwgcmVjdXJzZSBmb3IgcmlnaHQgc3VidHJlZQogICAgZWxzZQogICAgICAgIHJvb3QtPnJpZ2h0ID0gaW5zZXJ0KHJvb3QtPnJpZ2h0LCBrZXkpOwoKICAgIHJldHVybiByb290Owp9CgovLyBGdW5jdGlvbiB0byBmaW5kIGEgcGFpciB3aXRoIGdpdmVuIHN1bSBpbiBnaXZlbiBCU1QKYm9vbCBmaW5kUGFpcihOb2RlKiBYLCBOb2RlKiBZLCBpbnQgcGFpcl9zdW0sIGludCB4LCBpbnQgeSkKewogICAgaWYgKFggPT0gbnVsbHB0ciB8fCBZID09IG51bGxwdHIpCiAgICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vIGlmIGN1cnJlbnQgc3VtIGlzIGxlc3MgdGhhbiB0aGUgcmVxdWlyZWQgc3VtLCB1cGRhdGUgeAogICAgaWYgKHggKyB5IDwgcGFpcl9zdW0pCiAgICB7CiAgICAgICAgaWYgKGZpbmRQYWlyKFgtPmxlZnQsIFksIHBhaXJfc3VtLCB4LCB5KSkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICAgIHggPSBYLT5kYXRhOwogICAgICAgIAogICAgICAgIC8vIGlmIGN1cnJlbnQgc3VtIGlzIGVxdWFsIHRvIHRoZSByZXF1aXJlZCBzdW0sIAogICAgICAgIC8vIHByaW50IHRoZSBwYWlyIGFuZCByZXR1cm4gdHJ1ZQogICAgICAgIGlmICh4ICsgeSA9PSBwYWlyX3N1bSkKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgIlBhaXIgZm91bmQgKCIgPDwgeCA8PCAiLCAiIDw8IHkgPDwgIikiOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmaW5kUGFpcihYLT5yaWdodCwgWSwgcGFpcl9zdW0sIHgsIHkpOwogICAgfQoKICAgIC8vIGlmIGN1cnJlbnQgc3VtIGlzIG1vcmUgdGhhbiB0aGUgcmVxdWlyZWQgc3VtLCB1cGRhdGUgeQogICAgZWxzZSBpZiAoeCArIHkgPiBwYWlyX3N1bSkKICAgIHsKICAgICAgICBpZiAoZmluZFBhaXIoWCwgWS0+cmlnaHQsIHBhaXJfc3VtLCB4LCB5KSkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CgogICAgICAgIHkgPSBZLT5kYXRhOwoKICAgICAgICAvLyBpZiBjdXJyZW50IHN1bSBpcyBlcXVhbCB0byB0aGUgcmVxdWlyZWQgc3VtLCAKICAgICAgICAvLyBwcmludCB0aGUgcGFpciBhbmQgcmV0dXJuIHRydWUKICAgICAgICBpZiAoeCArIHkgPT0gcGFpcl9zdW0pCiAgICAgICAgewogICAgICAgICAgICBjb3V0IDw8ICJQYWlyIGZvdW5kICgiIDw8IHggPDwgIiwgIiA8PCB5IDw8ICIpIjsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmluZFBhaXIoWCwgWS0+bGVmdCwgcGFpcl9zdW0sIHgsIHkpOwogICAgfQp9CgovLyBtYWluIGZ1bmN0aW9uCmludCBtYWluKCkKewogICAgaW50IGtleXNbXSA9IHsgNywgMTAsIDksIDIwIH07CgogICAgTm9kZSogcm9vdCA9IG51bGxwdHI7CiAgICBmb3IgKGludCBrZXkgOiBrZXlzKQogICAgICAgIHJvb3QgPSBpbnNlcnQocm9vdCwga2V5KTsKCiAgICAvLyBnaXZlbiBwYWlyX3N1bQogICAgaW50IHBhaXJfc3VtID0gNDA7CgogICAgLy8gZmluZCBNaW5pbXVtIGFuZCBNYXhpbXVtIGtleSBpbiBiaW5hcnkgc2VhcmNoIHRyZWUKICAgIGludCB4ID0gTWluVmFsdWUocm9vdCk7CiAgICBpbnQgeSA9IE1heFZhbHVlKHJvb3QpOwoKICAgIGlmICghZmluZFBhaXIocm9vdCwgcm9vdCwgcGFpcl9zdW0sIHgsIHkpKQogICAgICAgIGNvdXQgPDwgIlBhaXIgZG8gbm90IGV4aXN0cyI7CgogICAgcmV0dXJuIDA7Cn0=