Advertisement
igoryanchik

Treap

Oct 23rd, 2023
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.82 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4. #include <ctime>
  5. #include <queue>
  6. using namespace std;
  7.  
  8.  
  9. template<class T>
  10. class Node
  11. {
  12. private:
  13.     Node<T>* left;
  14.     Node<T>* right;
  15.     T key;
  16.     int priority;
  17.  
  18. public:
  19.     Node<T>()
  20.         : left(nullptr)
  21.         , right(nullptr)
  22.         , key(T())
  23.         , priority(rand())
  24.     { }
  25.  
  26.     Node<T>(const T& _key)
  27.         : left(nullptr)
  28.         , right(nullptr)
  29.         , key(_key)
  30.         , priority(rand())
  31.     { }
  32.  
  33.     ~Node<T>()
  34.     {
  35.         delete left;
  36.         delete right;
  37.         left = right = nullptr;
  38.     }
  39.  
  40.     template <class T>
  41.     friend class Treap;
  42.  
  43.     template <class T>
  44.     friend ostream& operator <<(ostream& out, Treap<T>& Tr);
  45. };
  46.  
  47. template <class T>
  48. class Treap
  49. {
  50. private:
  51.  
  52.  
  53.     Node<T>* root;
  54.     int size;
  55.  
  56.     Node<T>* merge(Node<T>* LeftTree, Node<T>* RightTree)
  57.     {
  58.         if (LeftTree == nullptr)
  59.             return RightTree;
  60.         if (RightTree == nullptr)
  61.             return LeftTree;
  62.  
  63.         if (LeftTree->priority > RightTree->priority)
  64.         {
  65.             LeftTree->right = merge(LeftTree->right, RightTree);
  66.             return LeftTree;
  67.         }
  68.         else
  69.         {
  70.             RightTree->left = merge(LeftTree, RightTree->left);
  71.             return RightTree;
  72.         }
  73.     }
  74.  
  75.     void split(Node<T>* node, Node<T>*& outLeft, Node<T>*& outRight, const T& data)
  76.     {
  77.         if (!node)
  78.         {
  79.             outLeft = outRight = nullptr;
  80.             return;
  81.         }
  82.  
  83.         if (node->key <= data)
  84.         {
  85.             outLeft = node;
  86.             split(node->right, outLeft->right, outRight, data);
  87.         }
  88.         else
  89.         {
  90.             outRight = node;
  91.             split(node->left, outLeft, outRight->left, data);
  92.         }
  93.     }
  94.  
  95.     void inserting(Node<T>*& node, Node<T>* elem)
  96.     {
  97.         Node<T>* l;
  98.         Node<T>* r;
  99.         split(node, l, r, elem->key);
  100.  
  101.         node = merge(merge(l, elem), r);
  102.     }
  103.  
  104.     void remove(Node<T>*& node, const T& data)
  105.     {
  106.         Node<T>* l;
  107.         Node<T>* r;
  108.         Node<T>* mid;
  109.  
  110.         split(root, l, r, data-1);
  111.         split(r, mid, r, data);
  112.  
  113.         node = merge(l, r);
  114.  
  115.     }
  116.  
  117.     void build_treap(vector<int>& vec)
  118.     {
  119.         for (int i = 0; i < vec.size(); ++i)
  120.         {
  121.             insert(vec[i]);
  122.         }
  123.     }
  124.  
  125.     Node<T>* treeSearch(Node<T>* node, const T& data) const
  126.     {
  127.         if (!node || node->key == data)
  128.             return node;
  129.        
  130.         if (node->key < data)
  131.             return treeSearch(node->right,data);
  132.  
  133.         return treeSearch(node->left, data);
  134.     }
  135.  
  136. public:
  137.  
  138.     Treap()
  139.         : root(nullptr)
  140.         , size(0)
  141.     { }
  142.  
  143.     Treap(vector<T>& vec)
  144.     {
  145.         build_treap(vec);
  146.     }
  147.  
  148.     int getSize() const
  149.     {
  150.         return size;
  151.     }
  152.  
  153.     bool empty() const
  154.     {
  155.         return (size == 0);
  156.     }
  157.  
  158.     bool find(const T& data) const
  159.     {
  160.         Node<T>* ans = treeSearch(root, data);
  161.        
  162.         return (data == ans->key);
  163.     }
  164.  
  165.     void insert(const T& data)
  166.     {
  167.         Node<T>* elem = new Node<T>(data);
  168.         if (!elem)
  169.             throw "MemoryAllocError";
  170.  
  171.         if (!root)
  172.             root = elem;
  173.         else
  174.             inserting(root, elem);
  175.  
  176.         size++;
  177.     }
  178.  
  179.     void erase(const T& data)
  180.     {
  181.         if (!root)
  182.         {
  183.             cout << "Treap is empty";
  184.             return;
  185.         }
  186.  
  187.         remove(root, data);
  188.         size--;
  189.     }
  190.  
  191.  
  192.     template <class T>
  193.     friend ostream& operator <<(ostream& out, Treap<T>& Tr);
  194. };
  195.  
  196. template <class T>
  197. ostream& operator <<(ostream& out, Treap<T>& Tr)
  198. {
  199.     if (out && Tr.root)
  200.     {
  201.         queue<Node<T>*> q;
  202.         q.push(Tr.root);
  203.  
  204.         while (!q.empty())
  205.         {
  206.             Node<T>* v = q.front();
  207.             q.pop();
  208.  
  209.             if (v->right) q.push(v->right);
  210.             if (v->left) q.push(v->left);
  211.  
  212.             out << "Key: " << v->key << ", Priority: " << v->priority << '\n';
  213.         }
  214.     }
  215.  
  216.     return out;
  217. }
  218.  
  219. int main()
  220. {
  221.  
  222.     Treap<int> treap;
  223.     treap.insert(10);
  224.     treap.insert(15);
  225.     treap.insert(16);
  226.     treap.insert(40);
  227.     treap.insert(41);
  228.  
  229.     cout << "Size: " << treap.getSize() << '\n';
  230.     cout << "Treap:\n" << treap;
  231.  
  232.     treap.erase(41);
  233.     cout << "Size: " << treap.getSize() << '\n';
  234.     cout << "Treap:\n" << treap;
  235.  
  236.  
  237.     cout << "Check build on vector:\n";
  238.     vector<int> vec = { 1, 2, 3, 15, 12, 10 };
  239.     Treap<int> treap2(vec);
  240.  
  241.     cout << "Treap2:\n" << treap2;
  242.  
  243.     cout << "15 is " << (treap.find(15) ? "find" : "not find") << '\n';
  244.  
  245.     return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement