loulett

Splay_Tree

May 19th, 2015
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.60 KB | None | 0 0
  1. #include <iostream>
  2. #include <cassert>
  3. #include <vector>
  4.  
  5. class Splay_Tree
  6. {
  7. public:
  8.     Splay_Tree() :root(0) {}
  9.     ~Splay_Tree();
  10.  
  11.     bool Add(int Key);
  12.     bool Delete(int Key)
  13.     {
  14.         Node* node = const_cast<Node*>(find(root, Key));
  15.         splay(node);
  16.         return(erase(Key));
  17.     }
  18.     bool Find(int Key)
  19.     {
  20.         Node* node = const_cast<Node*>(find(root, Key));
  21.         if (!node)
  22.             return false;
  23.         splay(node);
  24.         return true;
  25.     }
  26.  
  27.     struct Node {
  28.         int key;
  29.         Node* left;
  30.         Node* right;
  31.         Node* parent;
  32.  
  33.         Node(int key) : key(key), left(0), right(0), parent(0) {}
  34.     };
  35.  
  36.     Splay_Tree(Node* node) : root(node) {}
  37.  
  38. private:
  39.  
  40.     Node* root;
  41.    
  42.     void deleteNode(Node*& node);
  43.  
  44.     void splay(Node* node);
  45.  
  46.     void right_turn(Node* node);
  47.     void left_turn(Node* node);
  48.  
  49.     const Node* find(const Node* node, int key) const;
  50.  
  51.     Node* getNext(Node* node);
  52.     void detach(Node* node);
  53.     bool erase(int key);
  54. };
  55.  
  56. Splay_Tree::~Splay_Tree()
  57. {
  58.     deleteNode(root);
  59.     root = 0;
  60. }
  61.  
  62. void Splay_Tree::deleteNode(Node*& node)
  63. {
  64.     if (node == 0)
  65.         return;
  66.     deleteNode(node->left);
  67.     deleteNode(node->right);
  68.  
  69.     delete node;
  70. }
  71.  
  72. void Splay_Tree::left_turn(Node* node)
  73. {
  74.     Node* b = node->right;
  75.     node->right = b->left;
  76.     if (b->left != 0)
  77.         b->left->parent = node;
  78.     b->parent = node->parent;
  79.     if (node->parent)
  80.     {
  81.         if (node == node->parent->right)
  82.             node->parent->right = b;
  83.         else
  84.             node->parent->left = b;
  85.     }
  86.     else
  87.         root = b;
  88.     b->left = node;
  89.     node->parent = b;
  90. }
  91.  
  92. void Splay_Tree::right_turn(Node* node)
  93. {
  94.     Node* b = node->left;
  95.     node->left = b->right;
  96.     if (b->right != 0)
  97.         b->right->parent = node;
  98.     b->parent = node->parent;
  99.     if (node->parent)
  100.     {
  101.         if (node == node->parent->right)
  102.             node->parent->right = b;
  103.         else
  104.             node->parent->left = b;
  105.     }
  106.     else
  107.         root = b;
  108.     b->right = node;
  109.     node->parent = b;
  110. }
  111.  
  112. void Splay_Tree::splay(Node* x)
  113. {
  114.     while (x != root)
  115.     {
  116.         Splay_Tree::Node* g = x->parent->parent;
  117.         if (x->parent == root)
  118.         {
  119.             if (x == x->parent->left)
  120.                 right_turn(x->parent);
  121.             else
  122.                 left_turn(x->parent);
  123.             return;
  124.         }
  125.         else if (x->parent->left == x && g->left == x->parent)
  126.         {
  127.             right_turn(g);
  128.             right_turn(x->parent);
  129.         }
  130.         else if (x->parent->right == x && g->right == x->parent)
  131.         {
  132.             left_turn(g);
  133.             left_turn(x->parent);
  134.         }
  135.         else if (x->parent->right == x && x->parent->parent->left == x->parent)
  136.         {
  137.             left_turn(x->parent);
  138.             right_turn(g);
  139.         }
  140.         else
  141.         {
  142.             right_turn(x->parent);
  143.             left_turn(g);
  144.         }
  145.     }
  146. }
  147.  
  148. const Splay_Tree::Node* Splay_Tree::find(const Node* node, int Key) const
  149. {
  150.     if (node == 0)
  151.         return 0;
  152.     if (node->key == Key)
  153.         return node;
  154.     return node->key > Key ? find(node->left, Key) : find(node->right, Key);
  155. }
  156.  
  157. bool Splay_Tree::Add(int Key)
  158. {
  159.     if (!root)
  160.     {
  161.         root = new Node(Key);
  162.         return true;
  163.     }
  164.  
  165.     Node* cur_node = root;
  166.     while (true)
  167.     {
  168.         if (cur_node->key > Key && cur_node->left != 0)
  169.             cur_node = cur_node->left;
  170.         else if (cur_node->key < Key && cur_node->right != 0)
  171.             cur_node = cur_node->right;
  172.         else if (cur_node->key == Key)
  173.             return false;
  174.         else
  175.             break;
  176.     }
  177.     if (cur_node->key > Key)
  178.     {
  179.         cur_node->left = new Node(Key);
  180.         cur_node->left->parent = cur_node;
  181.         splay(cur_node->right);
  182.     }
  183.     else if (cur_node->key < Key)
  184.     {
  185.         cur_node->right = new Node(Key);
  186.         cur_node->right->parent = cur_node;
  187.         splay(cur_node->right);
  188.     }
  189.  
  190.     return true;
  191. }
  192.  
  193. bool Splay_Tree::erase(int key)
  194. {
  195.     Node* node = const_cast<Node*>(find(root, key));
  196.     if (node == 0)
  197.         return false;
  198.     if (node == root && node->left == 0 && node->right == 0)
  199.     {
  200.         delete node;
  201.         root = 0;
  202.         return true;
  203.     }
  204.     if (node->left == 0 || node->right == 0)
  205.     {
  206.         detach(node);
  207.         delete node;
  208.         return true;
  209.     }
  210.  
  211.     Node* next = getNext(node);
  212.     node->key = next->key;
  213.    
  214.     detach(next);
  215.     delete next;
  216.     return true;
  217. }
  218.  
  219. Splay_Tree::Node* Splay_Tree::getNext(Node* node)
  220. {
  221.     Node* candidate = node->right;
  222.     while (candidate->left != 0)
  223.         candidate = candidate->left;
  224.     return candidate;
  225. }
  226.  
  227. void Splay_Tree::detach(Node* node)
  228. {
  229.     assert(node->left == 0 || node->right == 0);
  230.  
  231.     Node* child = node->left == 0 ? node->right : node->left;
  232.  
  233.     if (child != 0)
  234.     {
  235.         child->parent = node->parent;
  236.         if (child->parent == 0)
  237.         {
  238.             root = child;
  239.         }
  240.     }
  241.     if (node->parent != 0)
  242.     {
  243.         node->parent->left == node
  244.             ? node->parent->left = child
  245.             : node->parent->right = child;
  246.     }
  247.  
  248.     node->left = 0;
  249.     node->right = 0;
  250.     node->parent = 0;
  251. }
  252.  
  253. int main()
  254. {
  255.     Splay_Tree T;
  256.     std::vector<int> arr = { 1, 8, 6, 11, 13, 17, 15, 25, 22, 27 };
  257.     for (int i = 0; i < 10; i++)
  258.         T.Add(arr[i]);
  259.     T.Find(6);
  260.     T.Delete(27);
  261.     return 0;
  262. }
Advertisement
Add Comment
Please, Sign In to add comment