CrazzyBeer

Red Black Tree C++

Sep 4th, 2015
573
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. struct rb_tree {
  2.     struct node {
  3.         int val;
  4.         node *left = nullptr, *right = nullptr;
  5.         bool red = true;
  6.         int sz = 0;
  7.     };
  8.     node *root = nullptr;
  9.     int t;
  10.     bool isRed(node *h) {
  11.         if ( h == nullptr ) return false;
  12.         else return (h->red);
  13.     }
  14.  
  15.     void add(int x) {
  16.         root = add(root, x);
  17.     }
  18.     node* add(node *h, int x) {
  19.         if (h == nullptr) {
  20.             h = new node;
  21.  
  22.             h->val = x;
  23.             h->sz = 1;
  24.             h->red = true;
  25.  
  26.             return h;
  27.         }
  28.         if (x > h->val) {
  29.             h->right = add(h->right, x);
  30.         } else {
  31.             h->left = add(h->left, x);
  32.         }
  33.         if (isRed(h->right) && !isRed(h->left))  h = rotateLeft(h);
  34.         if (isRed(h->left)  &&  isRed(h->left->left)) h = rotateRight(h);
  35.         if (isRed(h->left)  &&  isRed(h->right))     flipColors(h);
  36.  
  37.         h->sz = size(h->left) + size(h->right) + 1;
  38.  
  39.         return h;
  40.     }
  41.     int size(node *h) {
  42.         if ( h == nullptr) return 0;
  43.         return h->sz;
  44.     }
  45.     void flipColors(node *h) {
  46.         h->red = !h->red;
  47.         h->left->red = !h->left->red;
  48.         h->right->red = !h->right->red;
  49.     }
  50.     node* rotateRight(node *h) {
  51.         node *x = h->left;
  52.         h->left = x->right;
  53.         x->right = h;
  54.         x->red = x->right->red;
  55.         x->right->red = true;
  56.         x->sz = size(h);
  57.         h->sz = size(h->left) + size(h->right) + 1;
  58.         return x;
  59.     }
  60.     node* rotateLeft(node *h) {
  61.         node *x = h->right;
  62.         h->right = x->left;
  63.         x->left = h;
  64.         x->red = x->left->red;
  65.         x->left->red = true;
  66.         x->sz = size(h);
  67.         h->sz = size(h->left) + size(h->right) + 1;
  68.  
  69.         return x;
  70.     }
  71.     int count_greater(node *h, int x) {
  72.         if (h == nullptr) return 0;
  73.         int g = h->val;
  74.         int s = size(h->left);
  75.         if (x < h->val) return 1 + size(h->right) + count_greater(h->left,x);
  76.         else return count_greater(h->right,x);
  77.     }
  78. } tree;
Advertisement
Add Comment
Please, Sign In to add comment