CareerCup-4.6

来源:互联网 发布:电脑数据流量统计 编辑:程序博客网 时间:2024/06/05 22:32
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");  };


原创粉丝点击