Advertisement
xxeell

Final_task_2

Jul 4th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. class Exception
  8. {
  9. private:
  10.     string content;
  11. public:
  12.     Exception(string message) : content(message) {}
  13.  
  14.     string Message()
  15.     {
  16.         return content;
  17.     }
  18. };
  19.  
  20. template<class T> class BinaryTree
  21. {
  22. private:
  23.     class Node
  24.     {
  25.     private:
  26.         Node* left;
  27.         Node* right;
  28.         unsigned char height;
  29.         T val;
  30.     public:
  31.         Node(T val) : val(val), left(0), right(0), height(1) {}
  32.  
  33.         Node(T val, Node* left, Node* right) : val(val), left(left), right(right)
  34.         {
  35.             height = left->Height() > right->Height() ? left->Height() : right->Height();
  36.         }
  37.  
  38.         Node* Left()
  39.         {
  40.             return left;
  41.         }
  42.  
  43.         void Left(Node* left)
  44.         {
  45.             this->left = left;
  46.         }
  47.  
  48.         Node* Right()
  49.         {
  50.             return right;
  51.         }
  52.  
  53.         void Right(Node* right)
  54.         {
  55.             this->right = right;
  56.         }
  57.  
  58.         T Value()
  59.         {
  60.             return val;
  61.         }
  62.  
  63.         unsigned char Height()
  64.         {
  65.             return height;
  66.         }
  67.  
  68.         void Height(unsigned char h)
  69.         {
  70.             height = h;
  71.         }
  72.     };
  73.  
  74.     Node* head;
  75.     int cnt;
  76.  
  77.     bool is_less(const T& a, const T& b) const
  78.     {
  79.         return a < b;
  80.     }
  81.  
  82.     bool is_more(const T& a, const T& b) const
  83.     {
  84.         return b < a;
  85.     }
  86.  
  87.     bool is_equally(const T& a, const T& b) const
  88.     {
  89.         return !(a < b) && !(b < a);
  90.     }
  91.  
  92.     unsigned char node_height(Node* p)
  93.     {
  94.         return p ? p->Height() : 0;
  95.     }
  96.  
  97.     int balanse_factor(Node* p)
  98.     {
  99.         return node_height(p->Right()) - node_height(p->Left());
  100.     }
  101.  
  102.     void update_height(Node* p)
  103.     {
  104.         unsigned char height_left = node_height(p->Left());
  105.         unsigned char height_right = node_height(p->Right());
  106.         p->Height((height_left > height_right ? height_left : height_right) + 1);
  107.     }
  108.  
  109.     Node* rotate_node_to_right(Node* p)
  110.     {
  111.         Node* q = p->Left();
  112.         p->Left(q->Right());
  113.         q->Right(p);
  114.  
  115.         update_height(p);
  116.         update_height(q);
  117.         return q;
  118.     }
  119.  
  120.     Node* rotate_node_to_left(Node* q)
  121.     {
  122.         Node* p = q->Right();
  123.         q->Right(p->Left());
  124.         p->Left(q);
  125.  
  126.         update_height(q);
  127.         update_height(p);
  128.         return p;
  129.     }
  130.  
  131.     Node* balance_node(Node* p)
  132.     {
  133.         update_height(p);
  134.  
  135.         if(balanse_factor(p) == 2)
  136.         {
  137.             if(balanse_factor(p->Right()) < 0 )
  138.             {
  139.                 if(p->Left()->Right())
  140.                 {
  141.                     p->Right(rotate_node_to_right(p->Right()));
  142.                 }
  143.             }
  144.             return rotate_node_to_left(p);
  145.         }
  146.  
  147.         if(balanse_factor(p) == -2)
  148.         {
  149.             if(balanse_factor(p->Left()) > 0)
  150.             {
  151.                 if(p->Right()->Left())
  152.                 {
  153.                     p->Left(rotate_node_to_left(p->Left()));
  154.                 }
  155.             }
  156.             return rotate_node_to_right(p);
  157.         }
  158.  
  159.         return p;
  160.     }
  161.  
  162.     Node* find_min(Node* p)
  163.     {
  164.         Node* t = p;
  165.  
  166.         while(t->Left())
  167.         {
  168.             t = t->Left();
  169.         }
  170.  
  171.         return t;
  172.     }
  173.  
  174.     Node* remove_min(Node* p) // удаление узла с минимальным ключом из дерева p
  175.     {
  176. /*
  177.         class tStack
  178.         {
  179.         private:
  180.             class Element
  181.             {
  182.             public:
  183.                 Node* val;
  184.                 Element* next;
  185.  
  186.                 Element(Node* val, Element* next) : val(val), next(next) {}
  187.             };
  188.  
  189.             Element* head;
  190.         public:
  191.             tStack() : head() {}
  192.  
  193.             bool Empty() { return !head; }
  194.  
  195.             void Add(Node* val)
  196.             {
  197.                 head = new Element(val, head);
  198.             }
  199.  
  200.             void Get()
  201.             {
  202.                 if(!head) throw Exception("empty stack");
  203.  
  204.                 Element* t = head;
  205.                 head = head->next;
  206.                 Node* res = t->val;
  207.                 delete t;
  208.                 return res;
  209.             }
  210.         };
  211. */
  212.         if(!p->Left()) return p->Right();
  213.         p->Left(remove_min(p->Left()));
  214.         return balance_node(p);
  215.     }
  216.  
  217. public:
  218.     BinaryTree() : head(), cnt(0) {}
  219.  
  220.     bool Insert(T val)
  221.     {
  222.         if (!head)
  223.         {
  224.             head = new Node(val);
  225.             cnt = 1;
  226.             return true;
  227.         }
  228.  
  229.         Node* tnode = head;
  230.  
  231.         while (true)
  232.         {
  233.             if (is_equally(val, tnode->Value())) return false;
  234.  
  235.             if (is_less(val, tnode->Value()))
  236.             {
  237.                 if (!tnode->Left())
  238.                 {
  239.                     tnode->Left(new Node(val));
  240.                     cnt++;
  241.                     balance_node(head);
  242.                     return true;
  243.                 }
  244.  
  245.                 tnode = tnode->Left();
  246.                 continue;
  247.             }
  248.  
  249.             if (is_more(val, tnode->Value()))
  250.             {
  251.                 if (!tnode->Right())
  252.                 {
  253.                     tnode->Right(new Node(val));
  254.                     cnt++;
  255.                     balance_node(head);
  256.                     return true;
  257.                 }
  258.  
  259.                 tnode = tnode->Right();
  260.                 continue;
  261.             }
  262.         }
  263.     }
  264.  
  265.     bool Remove(T val)
  266.     {
  267.         if(!cnt || !head) return false;
  268.     }
  269.  
  270.     bool Remove(int k)
  271.     {
  272.         if(!head) return false;
  273.         Node* t = head;
  274.  
  275.         while(!is_equally(k, t->Value()))
  276.         {
  277.             if(is_less(k, t->Value()))
  278.             {
  279.                 if(!t->Left()) return false;
  280.                 t = t->Left();
  281.             }
  282.             else
  283.             {
  284.                 if(!t->Right()) return false;
  285.                 t = t->Right();
  286.             }
  287.         }
  288.  
  289.         // wtf?
  290.         // Heresy?
  291.  
  292.         Node* q = t->Left();
  293.         Node* r = t->Right();
  294.  
  295.         delete t;
  296.  
  297.         if(!r) return q;
  298.  
  299.         Node* min = find_min(r);
  300.         min->Right(remove_min(r));
  301.         min->Left(q);
  302.         return balance_node(min);
  303.     }
  304. };
  305.  
  306. int main()
  307. {
  308.     //freopen("output.txt", "w", stdout);
  309.     cout << "start. \n";
  310.  
  311.     BinaryTree<int> t;
  312.  
  313.     t.Insert(1);
  314.     t.Insert(2);
  315.     t.Insert(3);
  316.     t.Insert(4);
  317.     t.Insert(5);
  318.  
  319.     cout << "\nend.\n";
  320.     return 0;
  321. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement