loulett

RBTree

May 6th, 2015
274
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.21 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class RBTree
  5. {
  6. public:
  7.     RBTree() : root(0){}
  8.     ~RBTree();
  9.  
  10.     bool Add(int x);
  11.     bool Delete(int x);
  12.     bool Find(int x) { return (find(root, x) != 0); }
  13. private:
  14.     struct Node{
  15.         int key;
  16.         int color; // 0 - red, 1 - black
  17.         Node* left;
  18.         Node* right;
  19.         Node* parent;
  20.  
  21.         Node(int key) : key(key), color(0), left(0), right(0), parent(0){}
  22.     };
  23.  
  24.     Node* root;
  25.  
  26.     const Node* find(const Node* node, int key) const;
  27.     bool insert(Node*& node, int Key);
  28.  
  29.     void left_turn(Node*& node);
  30.     void right_turn(Node*& node);
  31.  
  32.     Node* grandparent(Node* node);
  33.     Node* uncle(Node* node);
  34.  
  35.     void insert_case1(Node*& node);
  36.     void insert_case2(Node*& node);
  37.     void insert_case3(Node*& node);
  38.     void insert_case4(Node*& node);
  39.     void insert_case5(Node*& node);
  40.  
  41.     void deleteNode(Node*& node);
  42. };
  43.  
  44. RBTree::~RBTree()
  45. {
  46.     deleteNode(root);
  47.     root = 0;
  48. }
  49.  
  50. void RBTree::deleteNode(Node*& node)
  51. {
  52.     if (node == 0)
  53.         return;
  54.     deleteNode(node->left);
  55.     deleteNode(node->right);
  56.  
  57.     delete node;
  58. }
  59.  
  60. RBTree::Node* RBTree::grandparent(Node* node)
  61. {
  62.     if (node != 0 && node->parent != 0)
  63.         return node->parent->parent;
  64.     else
  65.         return 0;
  66. }
  67.  
  68. RBTree::Node* RBTree::uncle(Node* node)
  69. {
  70.     Node*g = grandparent(node);
  71.     if (g == 0)
  72.         return 0;
  73.     if (node->parent == g->right)
  74.         return g->left;
  75.     else
  76.         return g->right;
  77. }
  78.  
  79. const RBTree::Node* RBTree::find(const Node* node, int Key) const
  80. {
  81.     if (node == 0)
  82.         return 0;
  83.     if (node->key == Key)
  84.         return node;
  85.     return node->key > Key ? find(node->left, Key) : find(node->right, Key);
  86. }
  87.  
  88. void RBTree::left_turn(Node*& node)
  89. {
  90.     int fl = (node->parent == 0) ? 1 : 0;
  91.     Node* a = node;
  92.     Node* b = node->right;
  93.     a->right = b->left;
  94.     if (a->right != 0)
  95.         a->right->parent = a;
  96.     b->parent = a->parent;
  97.     if (!fl)
  98.     {
  99.         if (a->parent->key > a->key)
  100.             a->parent->left = b;
  101.         else if (a->parent->key < a->key)
  102.             a->parent->right = b;
  103.     }
  104.     b->left = a;
  105.     a->parent = b;
  106.     if (fl)
  107.         root = b;
  108. }
  109.  
  110. void RBTree::right_turn(Node*& node)
  111. {
  112.     Node* b = node->left;
  113.     node->left = b->right;
  114.     if (b->right != 0)
  115.         b->right->parent = node;
  116.     b->parent = node->parent;
  117.     if (node->parent)
  118.     {
  119.         if (node == node->parent->right)
  120.             node->parent->right = b;
  121.         else
  122.             node->parent->left = b;
  123.     }
  124.     else
  125.         root = b;
  126.     b->right = node;
  127.     node->parent = b;
  128. }
  129.  
  130. void RBTree::insert_case1(Node*& node)
  131. {
  132.     if (node->parent == NULL) // node is root
  133.     {
  134.         node->color = 1; // paint node to black
  135.         return;
  136.     }
  137.     else
  138.         insert_case2(node);
  139. }
  140.  
  141. void RBTree::insert_case2(Node*& node)
  142. {
  143.     if (node->parent->color == 1) // parent is black
  144.         return; // all right
  145.     else
  146.         insert_case3(node);
  147. }
  148.  
  149. void RBTree::insert_case3(Node*& node)
  150. {
  151.     Node *g = grandparent(node), *u = uncle(node);
  152.     if ((u != 0) && (u->color == 0) && (node->parent->color == 0)) //parent and uncle are red
  153.     {
  154.         node->parent->color = 1; //paint parent to black
  155.         u->color = 1; // paint uncle to black
  156.         g->color = 0; // paint grandfather to red
  157.         insert_case1(g);
  158.     }
  159.     else
  160.         insert_case4(node);
  161.  
  162. }
  163.  
  164. void RBTree::insert_case4(Node*& node)
  165. {
  166.     Node *g = grandparent(node); // in fact, parent is red and uncle is black
  167.     if ((node == node->parent->right) && (node->parent == g->left))
  168.     {
  169.         left_turn(node->parent);
  170.         node = node->left;
  171.     }
  172.     else if ((node == node->parent->left) && (node->parent == g->right))
  173.     {
  174.         right_turn(node->parent);
  175.         node = node->right;
  176.     }
  177.     insert_case5(node);
  178. }
  179.  
  180. void RBTree::insert_case5(Node*& node)
  181. {
  182.     Node *g = grandparent(node);
  183.     node->parent->color = 1; // paint parent to black
  184.     g->color = 0; // paint grandfather to red
  185.     if ((node == node->parent->left) && (node->parent == g->left))
  186.         right_turn(g);
  187.     else
  188.         left_turn(g);
  189. }
  190.  
  191. bool RBTree::Add(int Key)
  192. {
  193.     if (!root)
  194.     {
  195.         root = new Node(Key);
  196.         root->color = 1;
  197.         return true;
  198.     }
  199.  
  200.     Node* cur_node = root;
  201.     while (true)
  202.     {
  203.         if (cur_node->key > Key && cur_node->left != 0)
  204.             cur_node = cur_node->left;
  205.         else if (cur_node->key < Key && cur_node->right != 0)
  206.             cur_node = cur_node->right;
  207.         else if (cur_node->key == Key)
  208.             return false;
  209.         else
  210.             break;
  211.     }
  212.     if (cur_node->key > Key)
  213.     {
  214.         cur_node->left = new Node(Key);
  215.         cur_node->left->parent = cur_node;
  216.         insert_case1(cur_node->left);
  217.     }
  218.     else if (cur_node->key < Key)
  219.     {
  220.         cur_node->right = new Node(Key);
  221.         cur_node->right->parent = cur_node;
  222.         insert_case1(cur_node->right);
  223.     }
  224.  
  225.     return true;
  226. }
  227.  
  228. int main()
  229. {
  230.     RBTree T;
  231.     std::vector<int> arr = { 1, 8, 6, 11, 13, 17, 15, 25, 22, 27 };
  232.     for (int i = 0; i < 10; i++)
  233.         T.Add(arr[i]);
  234.     return 0;
  235. }
Advertisement
Add Comment
Please, Sign In to add comment