Advertisement
35657

Untitled

Apr 6th, 2024 (edited)
660
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.85 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. template<typename T, typename S>
  6. class Map {
  7.  
  8. public:
  9.  
  10.     struct Node {
  11.         T key;
  12.         S value;
  13.         Node* left;
  14.         Node* right;
  15.         Node* parent;
  16.     };
  17.  
  18.     Map() : root_(nullptr), size_(0) {}
  19.  
  20.     void insert(const T& key, const S& val) {
  21.         if (root_ == nullptr) {
  22.             root_ = new Node{ key, val, nullptr, nullptr, nullptr };
  23.             size_++;
  24.             return;
  25.         }
  26.         Node* parent = nullptr;
  27.         Node* node = root_;
  28.         while (node != nullptr && node->key != key) {
  29.             parent = node;
  30.             node = node->key > key ? node->left : node->right;
  31.         }
  32.         if (node == nullptr) {
  33.             node = new Node{ key, val, nullptr, nullptr, parent };
  34.             parent->key > key ? parent->left = node : parent->right = node;
  35.             size_++;
  36.         }
  37.     }
  38.  
  39.     void erase(const T& key) {
  40.         Node* parent = nullptr;
  41.         Node* node = root_;
  42.         while (node != nullptr && node->key != key) {
  43.             parent = node;
  44.             node = node->key > key ? node->left : node->right;
  45.         }
  46.         if (node != nullptr) {
  47.             if (node->left == nullptr && node->right == nullptr) {
  48.                 if (node == root_) {
  49.                     root_ = nullptr;
  50.                 }
  51.                 else {
  52.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  53.                 }
  54.                 delete node;
  55.             }
  56.             else if (node->left == nullptr) {
  57.                 node->right->parent = node->parent;
  58.                 if (node == root_) {
  59.                     root_ = node->right;
  60.                 }
  61.                 else {
  62.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  63.                 }
  64.                 delete node;
  65.             }
  66.             else if (node->right == nullptr) {
  67.                 node->left->parent = node->parent;
  68.                 if (node == root_) {
  69.                     root_ = node->left;
  70.                 }
  71.                 else {
  72.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  73.                 }
  74.                 delete node;
  75.             }
  76.             else {
  77.                 Node* temp = min(node->right);
  78.                 node->key = temp->key;
  79.                 node->value = temp->value;
  80.                 if (temp->right != nullptr) {
  81.                     temp->right->parent = temp->parent;
  82.                 }
  83.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  84.                 delete temp;
  85.             }
  86.             size_--;
  87.         }
  88.     }
  89.  
  90.     Node* min(Node* node) {
  91.         if (node != nullptr) {
  92.             while (node->left != nullptr) {
  93.                 node = node->left;
  94.             }
  95.         }
  96.         return node;
  97.     }
  98.  
  99.     Node* max(Node* node) {
  100.         if (node != nullptr) {
  101.             while (node->right != nullptr) {
  102.                 node = node->right;
  103.             }
  104.         }
  105.         return node;
  106.     }
  107.  
  108.  
  109.     void print() {
  110.         print(root_);
  111.         cout << endl;
  112.     }
  113.  
  114.     int size() const {
  115.         return size_;
  116.     }
  117.  
  118. private:
  119.  
  120.     void print(Node* node) {
  121.         if (node != nullptr) {
  122.             print(node->left);
  123.             cout << node->key << " " << node->value << endl;;
  124.             print(node->right);
  125.         }
  126.     }
  127.  
  128.     Node* root_;
  129.     int size_;
  130. };
  131.  
  132.  
  133. int main() {
  134.  
  135.     setlocale(LC_ALL, "ru");
  136.  
  137.     Map<string, string> book;
  138.  
  139.     book.insert("Оля", "+71111111111");
  140.     book.insert("Гена", "+71111114444");
  141.     book.insert("Вася", "+71111115555");
  142.     book.insert("Аня", "+71111116666");
  143.  
  144.     book.print();
  145.  
  146.     book.erase("Гена");
  147.  
  148.     book.print();
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement