#include <bits/stdc++.h>
using
namespace
std;
struct
node {
int
key;
struct
node *left, *right;
};
node* newNode(
int
item)
{
node* temp =
new
node();
temp->key = item;
temp->left = temp->right = NULL;
return
temp;
}
struct
node* insert(
struct
node* node,
int
key)
{
if
(node == NULL)
return
newNode(key);
if
(key < node->key)
node->left = insert(node->left, key);
else
if
(key > node->key)
node->right = insert(node->right, key);
return
node;
}
int
sizeOfTree(node* root)
{
if
(root == NULL) {
return
0;
}
int
left = sizeOfTree(root->left);
int
right = sizeOfTree(root->right);
return
(left + right + 1);
}
void
storeInorder(node* root,
int
inOrder[],
int
& index)
{
if
(root == NULL) {
return
;
}
storeInorder(root->left, inOrder, index);
inOrder[index++] = root->key;
storeInorder(root->right, inOrder, index);
}
void
printPairUtil(
int
inOrder1[],
int
inOrder2[],
int
index1,
int
index2,
int
k)
{
for
(
int
i = 0; i < index1; i++) {
for
(
int
j = 0; j < index2; j++) {
int
sum = inOrder1[i] + inOrder2[j];
if
(sum > k)
cout <<
"("
<< inOrder1[i] <<
", "
<< inOrder2[j] <<
")"
<< endl;
}
}
}
void
printPairs(node* root1, node* root2,
int
k)
{
int
numNode = sizeOfTree(root1);
int
inOrder1[numNode + 1];
int
index1 = 0;
numNode = sizeOfTree(root2);
int
inOrder2[numNode + 1];
int
index2 = 0;
storeInorder(root1, inOrder1, index1);
storeInorder(root2, inOrder2, index2);
printPairUtil(inOrder1, inOrder2, index1, index2, k);
}
int
main()
{
struct
node* root1 = NULL;
root1 = insert(root1, 5);
insert(root1, 3);
insert(root1, 2);
insert(root1, 4);
insert(root1, 7);
insert(root1, 6);
insert(root1, 8);
struct
node* root2 = NULL;
root2 = insert(root2, 10);
insert(root2, 6);
insert(root2, 15);
insert(root2, 3);
insert(root2, 8);
insert(root2, 11);
insert(root2, 18);
int
x = 20;
printPairs(root1, root2, x);
return
0;
}