#include <bits/stdc++.h>
using
namespace
std;
struct
node {
int
data;
struct
node* left;
struct
node* right;
};
struct
node* newNode(
int
data)
{
struct
node* node
= (
struct
node*)
malloc
(
sizeof
(
struct
node));
node->data = data;
node->left = NULL;
node->right = NULL;
return
(node);
}
bool
printAncestors(
struct
node* root,
int
K, vector<
int
>& v)
{
if
(root == NULL)
return
false
;
if
(root->data == K)
return
true
;
if
(printAncestors(root->left, K, v)
|| printAncestors(root->right, K, v)) {
v.push_back(root->data);
return
true
;
}
return
false
;
}
int
dotProductOfVectors(vector<
int
>& v1, vector<
int
>& v2)
{
int
size1 = v1.size();
int
size2 = v2.size();
int
i = size1 - 1;
int
j = size2 - 1;
int
answer = 0;
while
(i >= 0 && j >= 0) {
answer = answer + (v1[i] * v2[j]);
i--;
j--;
}
return
answer;
}
int
dotProductOfAncestorsUtil(
struct
node* root1,
struct
node* root2,
int
K1,
int
K2)
{
vector<
int
> F1, F2;
if
(printAncestors(root1, K1, F1)
&& printAncestors(root1, K2, F2)) {
return
dotProductOfVectors(F1, F2);
}
else
if
(printAncestors(root2, K1, F1)
&& printAncestors(root2, K2, F2)) {
return
dotProductOfVectors(F1, F2);
}
else
if
(printAncestors(root1, K1, F1)
&& printAncestors(root2, K2, F2)) {
return
dotProductOfVectors(F1, F2);
}
else
{
if
(printAncestors(root2, K1, F1)
&& printAncestors(root1, K2, F2)) {
return
dotProductOfVectors(F1, F2);
}
}
return
0;
}
void
dotProductOfAncestors(
struct
node* root1,
struct
node* root2,
int
K1,
int
K2)
{
int
dotProduct
= dotProductOfAncestorsUtil(root1, root2, K1, K2);
cout << dotProduct;
}
int
main()
{
struct
node* root1 = newNode(1);
root1->left = newNode(2);
root1->right = newNode(3);
root1->left->left = newNode(4);
root1->left->right = newNode(5);
struct
node* root2 = newNode(6);
root2->left = newNode(7);
root2->right = newNode(8);
root2->left->left = newNode(9);
root2->right->right = newNode(10);
int
K1 = 4, K2 = 5;
dotProductOfAncestors(root1, root2, K1, K2);
}