igoryanchik

Splay tree

Sep 25th, 2023 (edited)
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <utility>
  3. #include <stack>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. template <class T>
  8. class Node
  9. {
  10. private:
  11.     Node* left;
  12.     Node* right;
  13.     Node* parent;
  14.     T data;
  15. public:
  16.  
  17.     Node<T>()
  18.     {
  19.         parent = left = right = nullptr;
  20.         data = T();
  21.     }
  22.  
  23.     Node<T>(T const& n)
  24.     {
  25.         left = right = parent = nullptr;
  26.         data = n;
  27.     }
  28.  
  29.     T getData()
  30.     {
  31.         return data;
  32.     }
  33.  
  34.     ~Node<T>()
  35.     {
  36.         delete right;
  37.         delete left;
  38.         right = left = parent = nullptr;
  39.     }
  40.  
  41.     template<class T>
  42.     friend class SplayTree;
  43.  
  44. };
  45.  
  46.  
  47. template<class T>
  48. class SplayTree
  49. {
  50. private:
  51.     Node<T>* root;
  52.  
  53.     //zag
  54.     void leftRotate(Node<T>* p)
  55.     {
  56.         Node<T>* x = p->right;
  57.         p->right = x->left;
  58.  
  59.         if (x->left != nullptr)
  60.             x->left->parent = p;
  61.  
  62.         if (p->parent == nullptr)
  63.             root = x;
  64.         else if (p->parent->left == p)
  65.             p->parent->left = x;
  66.         else p->parent->right = x;
  67.  
  68.         x->parent = p->parent;
  69.         x->left = p;
  70.         p->parent = x;
  71.     }
  72.  
  73.     //zig
  74.     void rightRotate(Node<T>* p)
  75.     {
  76.         Node<T>* x = p->left;
  77.         p->left = x->right;
  78.  
  79.         if (x->right != nullptr)
  80.             x->right->parent = p;
  81.  
  82.         if (p->parent == nullptr)
  83.             root = x;
  84.         else if (p == p->parent->left)
  85.             p->parent->left = x;
  86.         else
  87.             p->parent->right = x;
  88.  
  89.         x->parent = p->parent;
  90.         x->right = p;
  91.         p->parent = x;
  92.     }
  93.  
  94.     void splay(Node<T>* x)
  95.     {
  96.         while (x->parent != nullptr)
  97.         {
  98.             //zag and zig if the parent x does haven't a parent
  99.             if (x->parent->parent == nullptr)
  100.                 if (x == x->parent->left)
  101.                     rightRotate(x->parent);
  102.                 else
  103.                     leftRotate(x->parent);
  104.             else if (x == x->parent->left && x->parent == x->parent->parent->left)
  105.             {
  106.                 //zig-zig
  107.                 rightRotate(x->parent->parent);
  108.                 rightRotate(x->parent);
  109.             }
  110.             else if (x == x->parent->right && x->parent == x->parent->parent->right)
  111.             {
  112.                 //zag-zag
  113.                 leftRotate(x->parent->parent);
  114.                 leftRotate(x->parent);
  115.             }
  116.             else if (x == x->parent->right && x->parent == x->parent->parent->left)
  117.             {
  118.                 //zig-zag
  119.                 leftRotate(x->parent);
  120.                 rightRotate(x->parent);
  121.             }
  122.             else
  123.             {
  124.                 //zag-zig
  125.                 rightRotate(x->parent);
  126.                 leftRotate(x->parent);
  127.             }
  128.         }
  129.  
  130.     }
  131.  
  132.     Node<T>* treeSearch(T const& key, Node<T>* node = root)
  133.     {
  134.         if (node == nullptr || key == node->data)
  135.             return node;
  136.  
  137.         if (key < node->data)
  138.             return treeSearch(key, node->left);
  139.  
  140.         return treeSearch(key, node->right);
  141.     }
  142.  
  143.  
  144.  
  145.     Node<T>* join(Node<T>* s, Node<T>* t)
  146.     {
  147.         if (s == nullptr)
  148.             return t;
  149.         if (t == nullptr)
  150.             return s;
  151.  
  152.         Node<T>* x = find_max(s);
  153.         splay(x);
  154.         x->right = t;
  155.         t->parent = x;
  156.  
  157.         return x;
  158.     }
  159.  
  160.     pair<Node<T>*, Node<T>*> split(T const& data)
  161.     {
  162.         Node<T>* s;
  163.         Node<T>* t;
  164.         Node<T>* x = find(data);
  165.         splay(x);
  166.  
  167.         if (x->right != nullptr)
  168.         {
  169.             t = x->right;
  170.             t->parent = nullptr;
  171.         }
  172.  
  173.         s = x;
  174.         s->right = nullptr;
  175.         x == nullptr;
  176.  
  177.         return { s, t };
  178.     }
  179.  
  180.     Node<T>* tree_insert(T const& data)
  181.     {
  182.         Node<T>* insert_node = new Node<T>(data);
  183.  
  184.         if (insert_node == nullptr) throw "Nullptr";
  185.  
  186.         if (root == nullptr)
  187.         {
  188.             root = insert_node;
  189.             return root;
  190.         }
  191.  
  192.         Node<T>* cur = root;
  193.  
  194.         while (true)
  195.         {
  196.  
  197.             if (data < cur->data)
  198.             {
  199.                 if (cur->left == nullptr)
  200.                 {
  201.                     cur->left = insert_node;
  202.                     insert_node->parent = cur;
  203.                     break;
  204.                 }
  205.                 else cur = cur->left;
  206.             }
  207.             else
  208.             {
  209.                 if (cur->right == nullptr)
  210.                 {
  211.                     cur->right = insert_node;
  212.                     insert_node->parent = cur;
  213.                     break;
  214.                 }
  215.                 else cur = cur->right;
  216.             }
  217.         }
  218.         return insert_node;
  219.     }
  220.  
  221. public:
  222.  
  223.     SplayTree()
  224.     {
  225.         root = nullptr;
  226.     }
  227.  
  228.     SplayTree(Node<T> N)
  229.     {
  230.         this->root->data = N->data;
  231.         this->root->left = N->left;
  232.         this->root->right = N->right;
  233.     }
  234.  
  235.     Node<T>* getRoot()
  236.     {
  237.         return root;
  238.     }
  239.  
  240.     Node<T>* find(T const& key)
  241.     {
  242.         Node<T>* ans = treeSearch(key, root);
  243.  
  244.         if (ans != nullptr)
  245.             splay(ans);
  246.  
  247.         return ans;
  248.     }
  249.  
  250.  
  251.     void erase(const T& data)
  252.     {
  253.         pair<Node<T>*, Node<T>*> Q = split(data);
  254.  
  255.         if (root->left == nullptr && root->right == nullptr)
  256.         {
  257.             delete root;
  258.             root = nullptr;
  259.             return;
  260.         }
  261.  
  262.         if (Q.first->left == nullptr)
  263.             Q.first->left->parent = nullptr;
  264.  
  265.         root = join(Q.first->left, Q.second);
  266.     }
  267.  
  268.     void insert(T const& data)
  269.     {
  270.         Node<T>* ans = tree_insert(data);
  271.  
  272.         if (ans != nullptr)
  273.             splay(ans);
  274.     }
  275.  
  276.     Node<T>* find_max(Node<T>* node)
  277.     {
  278.         Node<T>* cur = node;
  279.         for (cur; cur->right != nullptr; cur = cur->right);
  280.  
  281.         splay(cur);
  282.         return cur;
  283.     }
  284.  
  285.     void PreOrder() const
  286.     {
  287.         cout << "\nPreOrder: ";
  288.         if (root == nullptr) return;
  289.  
  290.         stack<Node<T>*> s;
  291.         s.push(root);
  292.  
  293.         while (!s.empty())
  294.         {
  295.  
  296.             Node<T>* cur = s.top();
  297.             s.pop();
  298.  
  299.             cout << cur->data << " ";
  300.  
  301.             if (cur->left) s.push(cur->left);
  302.             if (cur->right) s.push(cur->right);
  303.  
  304.         }
  305.  
  306.         cout << '\n';
  307.  
  308.     }
  309.  
  310.     void InOrder() const
  311.     {
  312.         cout << "\nInOrder: ";
  313.         if (root == nullptr) return;
  314.  
  315.         stack<Node<T>*> s;
  316.         Node<T>* cur = root;
  317.  
  318.         s.push(root);
  319.  
  320.         while (!s.empty())
  321.         {
  322.  
  323.             while (cur->left != nullptr)
  324.             {
  325.                 s.push(cur->left);
  326.                 cur = cur->left;
  327.             }
  328.  
  329.             Node<T>* v = s.top();
  330.             s.pop();
  331.  
  332.             cout << v->data << " ";
  333.             if (v->right) s.push(v->right);
  334.         }
  335.  
  336.         cout << '\n';
  337.     }
  338.  
  339.     void PostOrder() const
  340.     {
  341.  
  342.         cout << "\nPostOrder: ";
  343.  
  344.         stack<Node<T>*> s, q;
  345.         s.push(root);
  346.         q.push(root);
  347.  
  348.         while (!s.empty())
  349.         {
  350.             Node<T>* cur = s.top();
  351.             s.pop();
  352.  
  353.             if (cur->left)
  354.             {
  355.                 q.push(cur->left);
  356.                 s.push(cur->left);
  357.             }
  358.  
  359.             if (cur->right)
  360.             {
  361.                 q.push(cur->right);
  362.                 s.push(cur->right);
  363.             }
  364.  
  365.         }
  366.  
  367.         while (!q.empty())
  368.         {
  369.             Node<T>* cur = q.top();
  370.             q.pop();
  371.  
  372.             cout << cur->data << " ";
  373.         }
  374.     }
  375.  
  376.     ~SplayTree<T>()
  377.     {
  378.         while (root != nullptr)
  379.         {
  380.             erase(root->data);
  381.         }
  382.     }
  383. };
  384.  
  385. int main()
  386. {
  387.     SplayTree<int> A;
  388.     A.insert(15);
  389.     A.insert(10);
  390.     A.insert(40);
  391.     A.insert(20);
  392.     A.insert(100);
  393.     A.insert(1);
  394.     A.insert(6);
  395.     A.insert(14);
  396.  
  397.     Node<int>* ptr = A.find_max(A.getRoot());
  398.     Node<int>* ptr2 = A.find(15);
  399.  
  400.     if (ptr2) cout << ptr2->getData() << " is find" << '\n';
  401.     cout << "The max element in tree: " << ptr->getData() << '\n';
  402.  
  403.     A.PreOrder();
  404.  
  405.     A.erase(40);
  406.     cout << "Element 40 is deleted\n";
  407.  
  408.     A.PreOrder();
  409.     A.InOrder();
  410.     A.PostOrder();
  411.  
  412.     return 0;
  413. }
Add Comment
Please, Sign In to add comment