Advertisement
Infernale

RBT

Apr 20th, 2020
708
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.46 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. enum{
  5.     RED,
  6.     BLACK,
  7.     DOUBLE_BLACK
  8. };
  9.  
  10. struct Node{
  11.     int data, color;
  12.     Node *left, *right, *parent;
  13.     Node(int data){
  14.         this->data = data;
  15.         this->color = RED;
  16.         left = right = parent = NULL;
  17.     }
  18. };
  19.  
  20. class RedBlackTree{
  21.     private:
  22.         Node *root;
  23.         void rotateLeft(Node *node){
  24.             Node *right = node->right;
  25.             node->right = right->left;
  26.             if(node->right != NULL)
  27.                 node->right->parent = node;
  28.             right->parent = node->parent;
  29.             if(node->parent == NULL)
  30.                 root = right;
  31.             else if(node == node->parent->left)
  32.                 node->parent->left = right;
  33.             else
  34.                 node->parent->right = right;
  35.             right->left = node;
  36.             node->parent = right;
  37.         }
  38.         void rotateRight(Node *node){
  39.             Node *left = node->left;
  40.             node->left = left->right;
  41.             if(node->left != NULL)
  42.                 node->left->parent = node;
  43.             left->parent = node->parent;
  44.             if(node->parent == NULL)
  45.                 root = left;
  46.             else if(node == node->parent->left)
  47.                 node->parent->left = left;
  48.             else
  49.                 node->parent->right = left;
  50.             left->right = node;
  51.             node->parent = left;
  52.         }
  53.         void fixInsertion(Node *node){
  54.             if(root == node){
  55.                 node->color = BLACK;
  56.                 return;
  57.             }
  58.             while(node->color != BLACK && node->parent->color == RED){
  59.                 Node *grand_parent = node->parent->parent;
  60.                 //When parent of new node is left child of grandparents of new node
  61.                 if(grand_parent->left == node->parent){
  62.                     Node *temp = grand_parent->right;
  63.                     //If new node's grand parent right child is red, recolor
  64.                     if(grand_parent->right != NULL && temp->color == RED){
  65.                         node->parent->color = temp->color = BLACK;
  66.                         grand_parent->color = RED;
  67.                         node = grand_parent;
  68.                     }else{
  69.                         //If node is right child of its parent, left rotate
  70.                         if(node->parent->right == node){
  71.                             rotateLeft(node->parent);
  72.                             node = node->parent;
  73.                         }
  74.                         //If node is left child of its parent, right rotate
  75.                         rotateRight(grand_parent);
  76.                         swap(node->parent->color, grand_parent->color);
  77.                         node = node->parent;
  78.                     }
  79.                 //When parent of new node is right child of grandparents of new node
  80.                 }else{
  81.                     Node *temp = grand_parent->left;
  82.                     //If grandparent left child is red, recolor
  83.                     if(grand_parent->left != NULL && temp->color == RED){
  84.                         node->parent->color = temp->color = BLACK;
  85.                         grand_parent->color = RED;
  86.                         node = grand_parent;
  87.                     }else{
  88.                         //If node is left child of its parent, right rotate (Same as right grandparent child case)
  89.                         if(node->parent->left == node){
  90.                             rotateRight(node);
  91.                             node = node->parent;
  92.                         }
  93.                         //If node is right click of its parent, left rotate
  94.                         rotateLeft(node);
  95.                         swap(node->parent->color, grand_parent->color);
  96.                         node = node->parent;
  97.                     }
  98.                 }
  99.                 root->color = BLACK;
  100.             }
  101.         }
  102.         Node* getSmallestNode(Node *node){
  103.             Node *curr = node;
  104.             while(curr->left != NULL)
  105.                 curr = curr->left;
  106.             return curr;
  107.         }
  108.         //Normal BST delete process
  109.         Node* deleteValue(Node *root, int target){
  110.             if(root == NULL)
  111.                 return root;
  112.             if(target < root->data)
  113.                 return deleteValue(root->left, target);
  114.             if(target > root->data)
  115.                 return deleteValue(root->right, target);
  116.             if(root->left == NULL || root->right == NULL)
  117.                 return root;
  118.             Node *temp = getSmallestNode(root->right);
  119.             root->data = temp->data;
  120.             return deleteValue(root->right, temp->data);
  121.         }
  122.         int getColor(Node *node){
  123.             if(node == NULL)
  124.                 return BLACK;
  125.             return node->color;
  126.         }
  127.         void fixDeletion(Node *node){
  128.             if(node == NULL)
  129.                 return;
  130.             if(node == root){
  131.                 root = NULL;
  132.                 return;
  133.             }
  134.             if(getColor(node) == RED || getColor(node->left) == RED || getColor(node->right) == RED){
  135.                 Node *child = node->left != nullptr ? node->left : node->right;
  136.                 if(node == node->parent->left){
  137.                     node->parent->left = child;
  138.                     if(child != NULL){
  139.                         child->parent = node->parent;
  140.                         child->color = BLACK;
  141.                     }
  142.                     delete(node);
  143.                 }else{
  144.                     node->parent->right = child;
  145.                     if(child != NULL){
  146.                         child->parent = node->parent;
  147.                         child->color = BLACK;
  148.                     }
  149.                     delete(node);
  150.                 }
  151.             }else{
  152.                 Node *parent, *sibling, *temp;
  153.                 parent = sibling = NULL;
  154.                 temp = node;
  155.                 temp->color = DOUBLE_BLACK;
  156.  
  157.                 while(temp != root && getColor(temp) == DOUBLE_BLACK){
  158.                     parent = temp->parent;
  159.                     if(temp == parent->left){
  160.                         sibling = parent->right;
  161.                         if(getColor(sibling) == RED){
  162.                             sibling->color = BLACK;
  163.                             parent->color = RED;
  164.                             rotateLeft(parent);
  165.                         }else{
  166.                             if(getColor(sibling->left) == BLACK && getColor(sibling->right) == BLACK){
  167.                                 sibling->color = RED;
  168.                                 if(getColor(parent) == RED)
  169.                                     parent->color = BLACK;
  170.                                 else
  171.                                     parent->color = DOUBLE_BLACK;
  172.                                 temp = parent;
  173.                             }else{
  174.                                 if(getColor(sibling->right) == BLACK){
  175.                                     sibling->left->color = BLACK;
  176.                                     sibling->color = RED;
  177.                                     rotateRight(sibling);
  178.                                     sibling = parent->right;
  179.                                 }
  180.                                 sibling->color = parent->color;
  181.                                 parent->color = sibling->right->color = BLACK;
  182.                                 rotateLeft(parent);
  183.                                 break;
  184.                             }
  185.                         }
  186.                     }else{
  187.                         sibling = parent->left;
  188.                         if(getColor(sibling) == RED){
  189.                             sibling->color = BLACK;
  190.                             parent->color = RED;
  191.                             rotateRight(parent);
  192.                         }else{
  193.                             if(getColor(sibling->left) == BLACK && getColor(sibling->right) == BLACK){
  194.                                 sibling->color = RED;
  195.                                 if(getColor(parent) == RED)
  196.                                     parent->color = BLACK;
  197.                                 else
  198.                                     parent->color = DOUBLE_BLACK;
  199.                                 temp = parent;
  200.                             }else{
  201.                                 if(getColor(sibling->left) == BLACK){
  202.                                     sibling->right->color = BLACK;
  203.                                     sibling->color = RED;
  204.                                     rotateLeft(sibling);
  205.                                     sibling = parent->left;
  206.                                 }
  207.                                 sibling->color = parent->color;
  208.                                 parent->color = sibling->left->color = BLACK;
  209.                                 rotateRight(parent);
  210.                                 break;
  211.                             }
  212.                         }
  213.                     }
  214.                 }
  215.                 if(node == node->parent->left)
  216.                     node->parent->left = NULL;
  217.                 else
  218.                     node->parent->right = NULL;
  219.                 delete(node);
  220.                 root->color = BLACK;
  221.             }
  222.         }
  223.     public:
  224.         RedBlackTree(){
  225.             this->root = NULL;
  226.         }
  227.         void insertNode(int data){
  228.             Node *node = new Node(data);
  229.             if(root == NULL){
  230.                 this->root = node;
  231.             }else{
  232.                 Node *curr = root, *parent;
  233.                 while(curr != NULL){
  234.                     parent = curr;
  235.                     if(curr->data < data)
  236.                         curr = curr->right;
  237.                     else
  238.                         curr = curr->left;
  239.                 }
  240.                 node->parent = parent;
  241.                 if(parent->data < data)
  242.                     parent->right = node;
  243.                 else
  244.                     parent->left = node;
  245.             }
  246.             fixInsertion(node);
  247.         }
  248.         void deleteNode(int target){
  249.             Node *node = deleteValue(root, target);
  250.             fixDeletion(node);
  251.         }
  252.         void searchNode(int target){
  253.             Node *curr = root;
  254.             while(curr->data != target){
  255.                 if(curr->data < target){
  256.                     curr = curr->right;
  257.                 }else{
  258.                     curr = curr->left;
  259.                 }
  260.             }
  261.             printf("Color of Node %d : %s\n", target, (curr->color == BLACK ? "BLACK" : "RED"));
  262.         }
  263. };
  264.  
  265. int main(){
  266.     RedBlackTree tree;
  267.     tree.insertNode(7);
  268.     tree.insertNode(6);
  269.     tree.insertNode(5);
  270.     tree.insertNode(4);
  271.     tree.insertNode(3);
  272.     tree.insertNode(2);
  273.     tree.insertNode(1);
  274.  
  275.     tree.deleteNode(4);
  276.     tree.deleteNode(3);
  277.     tree.searchNode(6);
  278.     return 0;
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement