#include <bits/stdc++.h>
using
namespace
std;
struct
Node
{
int
key;
struct
Node* left, *right;
};
struct
Node* newNode(
int
key)
{
struct
Node* n = (
struct
Node*)
malloc
(
sizeof
(
struct
Node*));
if
(n != NULL)
{
n->key = key;
n->left = NULL;
n->right = NULL;
return
n;
}
else
{
cout <<
"Memory allocation failed!"
<< endl;
exit
(1);
}
}
void
findMirror(Node* root,
int
target,
int
&target_level,
int
&target_position,
int
level,
int
position,
int
&mirror)
{
if
(!root)
return
;
if
(root->key==target){
target_level=level;
target_position = position;
return
;
}
if
(target_level!=-1 and level==target_level and (
abs
(position)==
abs
(target_position))){
mirror=root->key;
return
;
}
findMirror(root->left,target,target_level,target_position,level+1,position-1,mirror);
findMirror(root->right,target,target_level,target_position,level+1,position+1,mirror);
}
int
main()
{
struct
Node* root = newNode(1);
root-> left = newNode(2);
root->left->left = newNode(4);
root->left->left->right = newNode(7);
root->right = newNode(3);
root->right->left = newNode(5);
root->right->right = newNode(6);
root->right->left->left = newNode(8);
root->right->left->right = newNode(9);
int
target = root->left->left->key;
int
mirror = 0;
int
target_level=-1,target_position=-1;
findMirror(root, target,target_level,target_position,0,0,mirror);
if
(mirror!=0)
cout <<
"Mirror of Node "
<< target
<<
" is Node "
<< mirror << endl;
else
cout <<
"Mirror of Node "
<< target
<<
" is NULL! "
<< endl;
}