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
#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"); };