#include <iostream>
#include <stack>
#include <vector>
using
namespace
std;
struct
Node {
int
key;
struct
Node *left, *right;
};
Node* newNode(
int
ele)
{
Node* temp =
new
Node;
temp->key = ele;
temp->left = temp->right = NULL;
return
temp;
}
void
inorder(
struct
Node* root, vector<
int
> &traversal)
{
if
(root) {
inorder(root->left, traversal);
traversal.push_back(root->key);
inorder(root->right, traversal);
}
}
void
printCommon(Node* root1, Node* root2)
{
vector<
int
> inorder1, inorder2;
inorder(root1, inorder1);
inorder(root2, inorder2);
cout <<
"Tree 1 : "
<< endl;
for
(
int
i = 0; i < inorder1.size(); i++){
cout << inorder1[i] <<
" "
;
}
cout << endl;
cout <<
"Tree 2 : "
<< endl;
for
(
int
i = 0; i < inorder2.size(); i++){
cout << inorder2[i] <<
" "
;
}
cout << endl;
cout <<
"Common Nodes: "
<< endl;
int
i = 0, j = 0;
while
(i < inorder1.size() && j < inorder2.size()){
if
(inorder1[i] == inorder2[j]){
cout << inorder1[i] <<
" "
;
i++;
j++;
}
else
if
(inorder1[i] < inorder2[j]){
i++;
}
else
{
j++;
}
}
}
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
main()
{
Node* root1 = NULL;
root1 = insert(root1, 5);
root1 = insert(root1, 1);
root1 = insert(root1, 10);
root1 = insert(root1, 0);
root1 = insert(root1, 4);
root1 = insert(root1, 7);
root1 = insert(root1, 9);
Node* root2 = NULL;
root2 = insert(root2, 10);
root2 = insert(root2, 7);
root2 = insert(root2, 20);
root2 = insert(root2, 4);
root2 = insert(root2, 9);
printCommon(root1, root2);
return
0;
}