Advertisement
xxeell

Final_task

Jul 4th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <stdio.h>
  4. #include <string>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. class Exception
  10. {
  11. private:
  12.     string content;
  13. public:
  14.     Exception(string message) : content(message) {}
  15.  
  16.     string Message()
  17.     {
  18.         return content;
  19.     }
  20. };
  21.  
  22. template<class TKey, class TValue> class BinaryTree
  23. {
  24. private:
  25.     class Node
  26.     {
  27.     private:
  28.         Node* left;
  29.         Node* right;
  30.         TKey key;
  31.         TValue val;
  32.     public:
  33.         Node(TKey key, TValue val) : key(key), val(val), left(0), right(0) {}
  34.  
  35.         Node(TKey key, TValue val, Node* left, Node* right) : key(key), val(val), left(left), right(right) {}
  36.  
  37.         Node* Left()
  38.         {
  39.             return left;
  40.         }
  41.  
  42.         void Left(Node* left)
  43.         {
  44.             this->left = left;
  45.         }
  46.  
  47.         Node* Right()
  48.         {
  49.             return right;
  50.         }
  51.  
  52.         void Right(Node* right)
  53.         {
  54.             this->right = right;
  55.         }
  56.  
  57.         TKey Key()
  58.         {
  59.             return key;
  60.         }
  61.  
  62.         TValue Value()
  63.         {
  64.             return val;
  65.         }
  66.     };
  67.  
  68.     Node* head;
  69.     int cnt;
  70.  
  71.     bool is_less(const TKey& a, const TKey& b) const
  72.     {
  73.         return a < b;
  74.     }
  75.  
  76.     bool is_more(const TKey& a, const TKey& b) const
  77.     {
  78.         return b < a;
  79.     }
  80.  
  81.     bool is_equally(const TKey& a, const TKey& b) const
  82.     {
  83.         return !(a < b) && !(b < a);
  84.     }
  85.  
  86.     Node* find_parrent(TKey key)
  87.     {
  88.         if (!count) throw Exception("Empty tree");
  89.  
  90.         Node* tnode = head;
  91.  
  92.         if (is_equally(key, tnode->Key())) throw Exception("Have not this parent.");
  93.  
  94.         while (true)
  95.         {
  96.             if (is_less(key, tnode->Key()))
  97.             {
  98.                 if (!tnode->Left()) throw Exception("Have not this key.");
  99.  
  100.                 if(is_equally(key, tnode->Left()->Key())) return tnode;
  101.  
  102.                 tnode = tnode->Left();
  103.                 continue;
  104.             }
  105.  
  106.             if (is_more(key, tnode->Key()))
  107.             {
  108.                 if (!tnode->Right()) throw Exception("Have not this key.");
  109.  
  110.                 if(is_equally(key, tnode->Right()->Key())) return tnode;
  111.  
  112.                 tnode = tnode->Right();
  113.                 continue;
  114.             }
  115.         }
  116.     }
  117.  
  118.     Node* find_node(TKey key, Node* parent)
  119.     {
  120.         if(is_equally(key, parent->Right()->Key())) return parent->Right();
  121.  
  122.         if(is_equally(key, parent->Left()->Key())) return parent->Left();
  123.  
  124.         throw Exception("Have not this key.");
  125.     }
  126.  
  127.     void retreeing(Node* start, Node* del)
  128.     {
  129.         queue<Node*> tq, all_nodes;
  130.  
  131.         tq.push(start);
  132.         Node* tnode;
  133.  
  134.         while(tq.size())
  135.         {
  136.             tnode = tq.front();
  137.             tq.pop();
  138.  
  139.             if(tnode->Key() != del->Key()) all_nodes.push(tnode);
  140.  
  141.             if(tnode->Left())
  142.             {
  143.                 tq.push(tnode->Left());
  144.                 all_nodes.push(tnode->Left());
  145.             }
  146.  
  147.             if(tnode->Right())
  148.             {
  149.                 tq.push(tnode->Right());
  150.                 all_nodes.push(tnode->Right());
  151.             }
  152.         }
  153.  
  154.         // TODO smth
  155.     }
  156. public:
  157.     BinaryTree() : head(), cnt(0) {}
  158.  
  159.     bool Insert(TKey key, TValue val)
  160.     {
  161.         if (!head)
  162.         {
  163.             head = new Node(key, val);
  164.             cnt = 1;
  165.             return true;
  166.         }
  167.  
  168.         Node* tnode = head;
  169.  
  170.         while (true)
  171.         {
  172.             if (is_equally(key, tnode->Key())) return false;
  173.  
  174.             if (is_less(key, tnode->Key()))
  175.             {
  176.                 if (!tnode->Left())
  177.                 {
  178.                     tnode->Left(new Node(key, val));
  179.                     cnt++;
  180.                     return true;
  181.                 }
  182.  
  183.                 tnode = tnode->Left();
  184.                 continue;
  185.             }
  186.  
  187.             if (is_more(key, tnode->Key()))
  188.             {
  189.                 if (!tnode->Right())
  190.                 {
  191.                     tnode->Right(new Node(key, val));
  192.                     count++;
  193.                     return true;
  194.                 }
  195.  
  196.                 tnode = tnode->Right();
  197.                 continue;
  198.             }
  199.         }
  200.     }
  201.  
  202.     TValue Get(TKey key)
  203.     {
  204.         if (!count) throw Exception("Empty tree");
  205.  
  206.         Node* tnode = head;
  207.  
  208.         while (true)
  209.         {
  210.             if (is_equally(key, tnode->Key())) return tnode->Value();
  211.  
  212.             if (is_less(key, tnode->Key()))
  213.             {
  214.                 if (!tnode->Left()) throw Exception("Kave not this key.");
  215.  
  216.                 tnode = tnode->Left();
  217.                 continue;
  218.             }
  219.  
  220.             if (is_more(key, tnode->Key()))
  221.             {
  222.                 if (!tnode->Right()) throw Exception("Kave not this key.");
  223.  
  224.                 tnode = tnode->Right();
  225.                 continue;
  226.             }
  227.         }
  228.     }
  229.  
  230.     bool Remove(TKey key)
  231.     {
  232.         if(head->Key() == key)
  233.         {
  234.             if(!head->Left() && !head->Right())
  235.             {
  236.                 delete head;
  237.                 head = 0;
  238.                 return true;
  239.             }
  240.  
  241.             if()
  242.  
  243.             return true;
  244.         }
  245.  
  246.  
  247.     }
  248. };
  249.  
  250. int main()
  251. {
  252.     //freopen("output.txt", "w", stdout);
  253.     cout << "start. \n";
  254.  
  255.     BinaryTree<string, int> t;
  256.  
  257.     t.insert("1", 1);
  258.     t.insert("2", 2);
  259.     t.insert("3", 3);
  260.     t.insert("4", 4);
  261.     t.insert("5", 5);
  262.  
  263.     cout << t.get("1") << "\n";
  264.     cout << t.get("2") << "\n";
  265.     cout << t.get("3") << "\n";
  266.     cout << t.get("4") << "\n";
  267.     cout << t.get("5") << "\n";
  268.  
  269.     cout << "\nend.\n";
  270.     return 0;
  271. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement