loulett

Treap

May 18th, 2015
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. class Treap
  2. {
  3. public:
  4.     Treap() : root(0) {}
  5.     ~Treap();
  6.  
  7.     bool Add(int x, int y);
  8.     bool Delete(int x);
  9.     bool Find(int x);
  10.     int Size();
  11.  
  12.     struct Node
  13.     {
  14.         int x;
  15.         int y;
  16.         int high;
  17.         Node* left;
  18.         Node* right;
  19.  
  20.         Node(int x, int y) :x(x), y(y), high(0), left(0), right(0) {}
  21.         ~Node();
  22.         void UpdateSize();
  23.     };
  24.  
  25. private:
  26.     Node* root;
  27.  
  28.     Node* find(Node* node, int x);
  29. };
  30.  
  31. void Treap::Node::UpdateSize()
  32. {
  33.     if (left == 0 && right == 0)
  34.     {
  35.         high = 0;
  36.         return;
  37.     }
  38.     if (left != 0)
  39.         left->UpdateSize();
  40.     if (right != 0)
  41.         right->UpdateSize();
  42.     high = std::max((left != 0) ? left->high : 0, (right != 0) ? right->high :0) + 1;
  43. }
  44.  
  45. int Treap::Size()
  46. {
  47.     root->UpdateSize();
  48.     return root->high;
  49. }
  50.  
  51. Treap::Node::~Node()
  52. {
  53.     if (right != 0)
  54.         delete right;
  55.     if (left != 0)
  56.         delete left;
  57. }
  58.  
  59. Treap::~Treap()
  60. {
  61.     if (root != 0)
  62.         delete root;
  63. }
  64.  
  65. void split(int x, Treap::Node* M, Treap::Node*& left, Treap::Node*& right)
  66. {
  67.     if (!M)
  68.     {
  69.         left = 0;
  70.         right = 0;
  71.         return;
  72.     }
  73.     else if (M->x >= x)
  74.     {
  75.         split(x, M->left, left, M->left);
  76.         right = M;
  77.     }
  78.     else
  79.     {
  80.         split(x, M->right, M->right, right);
  81.         left = M;
  82.  
  83.     }
  84. }
  85.  
  86. Treap::Node* merge(Treap::Node* left, Treap::Node* right)
  87. {
  88.     if (!left)
  89.         return right;
  90.     if (!right)
  91.         return left;
  92.     if (left->y > right->y)
  93.     {
  94.         left->right = merge(left->right, right);
  95.         return left;
  96.     }
  97.     else
  98.     {
  99.         right->left = merge(left, right->left);
  100.         return right;
  101.     }
  102. }
  103.  
  104. bool Treap::Add(int x, int y)
  105. {
  106.     Treap::Node *left_treap = 0, *right_treap = 0, *new_node = new Treap::Node(x, y);
  107.     split(x, root, left_treap, right_treap);
  108.     root = merge(merge(left_treap, new_node), right_treap);
  109.     return true;
  110. }
  111.  
  112. Treap::Node* Treap::find(Treap::Node* node, int Key)
  113. {
  114.     if (node == 0)
  115.         return 0;
  116.     if (node->x == Key)
  117.         return node;
  118.     return node->x > Key ? find(node->left, Key) : find(node->right, Key);
  119. }
  120.  
  121. bool Treap::Find(int x)
  122. {
  123.     return find(root, x);
  124. }
  125.  
  126. bool Treap::Delete(int x)
  127. {
  128.     Treap::Node *left_treap = 0, *right_treap = 0, *cur_treap = 0;
  129.     split(x - 1, root, left_treap, right_treap);
  130.     split(x, right_treap, cur_treap, right_treap);
  131.     delete cur_treap;
  132.     root = merge(left_treap, right_treap);
  133.     return true;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment