loulett

search_tree

Apr 6th, 2015
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. #include <assert.h>
  2.  
  3. class Tree
  4. {
  5. public:
  6.     Tree() : root(0){}
  7.     ~Tree();
  8.  
  9.     bool Insert(int Key);
  10.     bool Delete(int Key);
  11.     bool Find(int Key);
  12.  
  13. private:
  14.     struct Node
  15.     {
  16.         int key;
  17.         Node* left;
  18.         Node* right;
  19.         Node* parent;
  20.  
  21.         Node(int Key) : key(Key), left(0), right(0), parent(0) {}
  22.         ~Node();
  23.     };
  24.  
  25.     Node* root;
  26.  
  27.     Node* find(Node* node, int key);
  28.     Node* getNext(Node* node);
  29.     void detach(Node* node);
  30. };
  31.  
  32.  
  33. Tree::~Tree()
  34. {
  35.     if (root != 0)
  36.         delete root;
  37. }
  38.  
  39. Tree::Node::~Node()
  40. {
  41.     if (left != 0)
  42.         delete left;
  43.     if (right != 0)
  44.         delete right;
  45. }
  46.  
  47. bool Tree::Insert(int Key)
  48. {
  49.     if (!root)
  50.     {
  51.         root->key = Key;
  52.         return true;
  53.     }
  54.  
  55.     Node* cur_node = root;
  56.     while (true)
  57.     {
  58.         if (cur_node->key > Key && cur_node->left != 0)
  59.             cur_node = cur_node->left;
  60.         else if (cur_node->key < Key && cur_node->right != 0)
  61.             cur_node = cur_node->right;
  62.         else if (cur_node->key == Key)
  63.             return false;
  64.         else
  65.             break;
  66.     }
  67.     if (cur_node->key > Key)
  68.     {
  69.         cur_node->left->key = Key;
  70.         cur_node->left->parent = cur_node;
  71.     }
  72.     else if (cur_node->key < Key)
  73.     {
  74.         cur_node->right->key = Key;
  75.         cur_node->left->parent = cur_node;
  76.     }
  77.     return true;
  78. }
  79.  
  80. Tree::Node* Tree::find(Node* node, int Key)
  81. {
  82.     if (node == 0)
  83.         return 0;
  84.     if (node->key == Key)
  85.         return node;
  86.     return node->key > Key ? find(node->left, Key) : find(node->right, Key);
  87. }
  88.  
  89. bool Tree::Find(int Key)
  90. {
  91.     return find(root, Key);
  92. }
  93.  
  94. bool Tree::Delete(int Key)
  95. {
  96.     Node* to_del = find(root, Key);
  97.  
  98.     if (to_del == 0)
  99.         return false;
  100.  
  101.     if (to_del->left == 0 || to_del->right == 0)
  102.     {
  103.         detach(to_del);
  104.         delete to_del;
  105.         return true;
  106.     }
  107.  
  108.     Node* next = getNext(to_del);
  109.  
  110.     to_del->key = next->key;
  111.  
  112.     detach(next);
  113.  
  114.     delete next;
  115.     return true;
  116. }
  117.  
  118. Tree::Node* Tree::getNext(Node* node)
  119. {
  120.     Node* candidate = node->right;
  121.     while (candidate->left != 0)
  122.         candidate = candidate->left;
  123.     return candidate;
  124. }
  125.  
  126. void Tree::detach(Node* node)
  127. {
  128.     assert(node->left == 0 || node->right == 0);
  129.  
  130.     if (node->parent == 0)
  131.         return;
  132.  
  133.     Node* child = node->left == 0 ? node->right : node->left;
  134.  
  135.     if (child != 0)
  136.     {
  137.         child->parent = node->parent;
  138.     }
  139.  
  140.     node->parent->left == node
  141.         ? node->parent->left = child
  142.         : node->parent->right = child;
  143.  
  144.     node->left = 0;
  145.     node->right = 0;
  146.     node->parent = 0;
  147. }
  148.  
  149. int main()
  150. {
  151.     Tree tree;
  152.     int array[] = { 5, 1, 5, 6, 2, 7, 8, 12, 21, 4, 0 };
  153.     for (int i = 0; i < 10; i++)
  154.     {
  155.         tree.Insert(array[i]);
  156.     }
  157.  
  158.     tree.Delete(7);
  159.     return 0;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment