Design an algorithm and write code to find the first common ancestor of two nodes
in a binary tree Avoid storing additional nodes in a data structure NOTE: This is not
necessarily a binary search tree
in a binary tree Avoid storing additional nodes in a data structure NOTE: This is not
necessarily a binary search tree
#include <iostream>
using namespace std;
typedef int Data;
struct Node
{
Node(Data d):data(d){left = right = NULL;};
Data data;
Node* left;
Node* right;
Node* parent;
};
struct ListNode
{
ListNode(Node* n):data(n){next = NULL;};
ListNode* next;
Node* data;
};
class Tree
{
public:
Tree():root(NULL){};
Node* root;
void insert(Data data, Node* node = NULL)
{
if(root == NULL)
{
root = new Node(data);
root->parent = NULL;
return;
}
if(node == NULL) node = root;
if(data == node->data)
{
return;
} else if(data < node->data) {
if(node->left == NULL)
{
node->left = new Node(data);
node->left->parent = node;
} else {
insert(data, node->left);
}
} else {
if(node->right == NULL)
{
node->right = new Node(data);
node->right->parent = node;
} else {
insert(data, node->right);
}
}
};
//first common ancestor
void fca(Node* a, Node* b)
{
Node* p = b;
while(a != NULL)
{
b = p;
while(b != NULL)
{
if(a == b)
{
cout<<a->data<<endl;
return;
}
b = b->parent;
}
a = a->parent;
}
};
int fca2(Node* a, Node* b, Node* node = NULL)
{
if(node == NULL)
node = root;
int r = 0;
if(node == a)
{
r += 1;
};
if(node == b)
{
r += 2;
};
if(r != 3)
{
r += node->left==NULL?0:fca2(a, b, node->left);
r += node->right==NULL?0:fca2(a, b, node->right);
}
if(r == 3)
{
cout<<"FCA: "<<node->data<<endl;
r = 0;
}
return r;
}
};
int main()
{
Tree tree;
tree.insert(5);
tree.insert(1);
tree.insert(7);
tree.insert(4);
tree.insert(3);
tree.fca2(tree.root, tree.root->left->right->left);
system("pause");
};