CareerCup-4.6

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);    
            }  
        }    
    };  
    void findNext(Node* n)  
    {  
        if(n == NULL) return;  
        if(n->right != NULL)  
        {  
            Node *p = n->right;  
            while(p->left != NULL)  
                p = p->left;  
            cout<<p->data<<endl;  
        } else {  
            if(n->parent == NULL)  
                return;  
            if(n == n->parent->left)  
            {  
                cout<<n->parent->data<<endl;  
            } else {  
                Node* p = n;  
                while(p->parent != NULL && p == p->parent->right)  
                {  
                    p = p->parent;  
                }  
                if(p->parent != NULL)  
                    cout<<p->parent->data<<endl;  
            }  
        }  
    };  
};    
    
int main()    
{    
    Tree tree;    
    tree.insert(5);    
    tree.insert(1);    
    tree.insert(7);    
    tree.insert(4);    
    tree.insert(3);  
    Node *n = tree.root->left->right;  
    cout<<n->data<<endl;  
    tree.findNext(n);  
    system("pause");    
};

Comments

comments powered by Disqus