CareerCup-4.5

来源:互联网 发布:三维软件培训机构 编辑:程序博客网 时间:2024/06/02 15:59

Write an algorithm to find the ‘next’ node (i e , in-order successor) of a given node in 
a binary search tree where each node has a link to its parent 

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