35657

Untitled

Jun 30th, 2023
1,012
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.00 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. template <typename K, typename V>
  7. class Map {
  8.  
  9. public:
  10.  
  11.     struct Node {
  12.         K key{};
  13.         V value{};
  14.         Node* left = nullptr;
  15.         Node* right = nullptr;
  16.         Node* parent = nullptr;
  17.     };
  18.  
  19.     Map() : size(0), root(nullptr) {}
  20.  
  21.     Map(const Map& other) : size(other.size), root(Copy(other.root, nullptr)) {}
  22.  
  23.     Map(Map&& other) : size(other.size), root(other.root) {
  24.         other.size = 0;
  25.         other.root = nullptr;
  26.     }
  27.  
  28.     Map& operator=(const Map& other) {
  29.         if (this != &other) {
  30.             Clear();
  31.             size = other.size;
  32.             root = Copy(other.root, nullptr);
  33.         }
  34.         return *this;
  35.     }
  36.  
  37.     Map& operator=(Map&& other) {
  38.         if (this != &other) {
  39.             Clear();
  40.             size = other.size;
  41.             root = other.root;
  42.             other.root = nullptr;
  43.             other.size = 0;
  44.         }
  45.         return *this;
  46.     }
  47.  
  48.     void Insert(const K& key, const V& value) {
  49.         if (root == nullptr) {
  50.             root = new Node{ key, value, nullptr, nullptr, nullptr };
  51.             size++;
  52.             return;
  53.         }
  54.         Node* parent = nullptr;
  55.         Node* node = root;
  56.         while (node != nullptr && node->key != key) {
  57.             parent = node;
  58.             node = node->key > key ? node->left : node->right;
  59.         }
  60.         if (node == nullptr) {
  61.             Node* temp = new Node{ key, value, nullptr, nullptr, parent };
  62.  
  63.             parent->key > key ? parent->left = temp : parent->right = temp;
  64.             size++;
  65.         }
  66.     }
  67.  
  68.     void Erase(const K& key) {
  69.         Node* parent = nullptr;
  70.         Node* node = root;
  71.         while (node != nullptr && node->key != key) {
  72.             parent = node;
  73.             node = node->key > key ? node->left : node->right;
  74.         }
  75.         if (node != nullptr) {
  76.             if (node->left == nullptr && node->right == nullptr) {
  77.                 if (node == root) {
  78.                     root = nullptr;
  79.                 }
  80.                 else {
  81.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  82.                 }
  83.                 delete node;
  84.             }
  85.             else if (node->left == nullptr) {
  86.                 node->right->parent = node->parent;
  87.                 if (node == root) {
  88.                     root = node->right;
  89.                 }
  90.                 else {
  91.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  92.                 }
  93.                 delete node;
  94.             }
  95.             else if (node->right == nullptr) {
  96.                 node->left->parent = node->parent;
  97.                 if (node == root) {
  98.                     root = node->left;
  99.                 }
  100.                 else {
  101.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  102.                 }
  103.                 delete node;
  104.             }
  105.             else {
  106.                 Node* temp = Min(node->right);
  107.                 if (temp->right) {
  108.                     temp->right->parent = temp->parent;
  109.                 }
  110.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  111.                 node->key = temp->key;
  112.                 node->value = temp->value;
  113.                 delete temp;
  114.             }
  115.             size--;
  116.         }
  117.     }
  118.  
  119.     Node* Min(Node* node) {
  120.         if (node != nullptr) {
  121.             while (node->left != nullptr) {
  122.                 node = node->left;
  123.             }
  124.         }
  125.         return node;
  126.     }
  127.  
  128.     Node* Max(Node* node) {
  129.         if (node != nullptr) {
  130.             while (node->right != nullptr) {
  131.                 node = node->right;
  132.             }
  133.         }
  134.         return node;
  135.     }
  136.  
  137.     Node* Find(const K& key) {
  138.         Node* node = root;
  139.         while (node != nullptr && node->key != key) {
  140.             node = node->key > key ? node->left : node->right;
  141.         }
  142.         return node;
  143.     }
  144.  
  145.     int Count(const K& key) {
  146.         return Find(key) == nullptr ? 0 : 1;
  147.     }
  148.  
  149.     Node* Next(Node* node) {
  150.         if (node) {
  151.             if (node->right) {
  152.                 return Min(node->right);
  153.             }
  154.             Node* parent = node->parent;
  155.             while (parent != nullptr && parent->key < node->key) {
  156.                 parent = parent->parent;
  157.             }
  158.             return parent;
  159.         }
  160.     }
  161.  
  162.     Node* Prev(Node* node) {
  163.         if (node) {
  164.             if (node->left) {
  165.                 return Max(node->right);
  166.             }
  167.             Node* parent = node->parent;
  168.             while (parent != nullptr && parent->key > node->key) {
  169.                 parent = parent->parent;
  170.             }
  171.             return parent;
  172.         }
  173.     }
  174.  
  175.     Node* Begin() {
  176.         return Min(root);
  177.     }
  178.  
  179.     Node* End() {
  180.         return Max(root);
  181.     }
  182.  
  183.     void Clear() {
  184.         Clear(root);
  185.         root = nullptr;
  186.         size = 0;
  187.     }
  188.  
  189.     void Clear(Node* node) {
  190.         if (node != nullptr) {
  191.             Clear(node->left);
  192.             Clear(node->right);
  193.             delete node;
  194.         }
  195.     }
  196.  
  197.     int Size() {
  198.         return size;
  199.     }
  200.  
  201.     Node* Copy(Node* node, Node* parent) {
  202.         if (node == nullptr) {
  203.             return node;
  204.         }
  205.         Node* temp = new Node{ node->key, node->value, nullptr, nullptr, parent };
  206.         temp->left = Copy(node->left, temp);
  207.         temp->right = Copy(node->right, temp);
  208.         return temp;
  209.     }
  210.  
  211.     bool Compare(Node* a, Node* b) {
  212.         Node* left = Min(a);
  213.         Node* right = Min(b);
  214.         while (left != nullptr && right != nullptr) {
  215.             if (left->key != right->key) {
  216.                 return false;
  217.             }
  218.             left = Next(left);
  219.             right = Next(right);
  220.         }
  221.         if (left == nullptr && right != nullptr || right == nullptr && left != nullptr) {
  222.             return false;
  223.         }
  224.         return true;
  225.     }
  226.  
  227.     void Print() {
  228.         Print(root);
  229.         cout << endl;
  230.     }
  231.  
  232.     void Print(Node* node) {
  233.         if (node != nullptr) {
  234.             Print(node->left);
  235.             cout << node->key << ": " << node->value << endl;
  236.             Print(node->right);
  237.         }
  238.     }
  239.  
  240.     bool operator==(const Map& other) {
  241.         if (size != other.size) {
  242.             return false;
  243.         }
  244.         return Compare(root, other.root);
  245.     }
  246.  
  247.     bool operator!=(const Map& other) {
  248.         return !(*this == other);
  249.     }
  250.  
  251.     ~Map() {
  252.         Clear();
  253.     }
  254.  
  255. private:
  256.     int size;
  257.     Node* root;
  258. };
  259.  
  260.  
  261. int main() {
  262.     Map<string, string> book;
  263.     book.Insert("Gena", "111111");
  264.     book.Insert("Julia", "111122");
  265.     book.Insert("Olya", "111133");
  266.     book.Insert("Ivan", "111144");
  267.     book.Insert("Vasya", "111155");
  268.     book.Print();
  269.  
  270.     book.Erase("Gena");
  271.     book.Print();
  272.  
  273.     cout << book.Count("Olya") << endl;
  274.     cout << book.Count("Gena") << endl;
  275.  
  276.     auto first = book.Begin();
  277.     cout << first->key << ": " << first->value  << endl;
  278.  
  279.     auto last = book.End();
  280.     cout << last->key << ": " << last->value  << endl;
  281.  
  282.     cout << book.Size() << endl;
  283.  
  284.     Map<string, string> book2;
  285.     book2 = book;
  286.     cout << "book2: " << endl;
  287.     book2.Print();
  288.  
  289.     Map<string, string> book3;
  290.     book3 = move(book2);
  291.     book3.Insert("Egor", "121212");
  292.     cout << "book3: " << endl;
  293.     book3.Print();
  294.  
  295.     cout << "book2: " << endl;
  296.     book2.Print();
  297.  
  298.     cout << boolalpha;
  299.     cout << (book == book3) << endl;
  300.     cout << (book != book3) << endl;
  301. }
  302.  
  303.  
Advertisement
Add Comment
Please, Sign In to add comment