Advertisement
35657

Untitled

Jun 30th, 2023
987
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. template <typename T>
  7. class Multiset {
  8.  
  9. public:
  10.  
  11.     struct Node {
  12.         T value{};
  13.         int count = 0;
  14.         Node* left = nullptr;
  15.         Node* right = nullptr;
  16.         Node* parent = nullptr;
  17.     };
  18.  
  19.     Multiset() : size(0), root(nullptr) {}
  20.  
  21.     void Insert(const T& val) {
  22.         if (root == nullptr) {
  23.             root = new Node{ val, 1, nullptr, nullptr, nullptr };
  24.             size++;
  25.             return;
  26.         }
  27.         Node* parent = nullptr;
  28.         Node* node = root;
  29.         while (node != nullptr && node->value != val) {
  30.             parent = node;
  31.             node = node->value > val ? node->left : node->right;
  32.         }
  33.         if (node == nullptr) {
  34.             Node* temp = new Node{ val, 1, nullptr, nullptr, parent };
  35.             parent->value > val ? parent->left = temp : parent->right = temp;
  36.         }
  37.         else {
  38.             node->count++;
  39.         }
  40.         size++;
  41.     }
  42.  
  43.     void Erase(const T& val) {
  44.         Node* parent = nullptr;
  45.         Node* node = root;
  46.         while (node != nullptr && node->value != val) {
  47.             parent = node;
  48.             node = node->value > val ? node->left : node->right;
  49.         }
  50.         if (node != nullptr) {
  51.             size -= node->count;
  52.             if (node->left == nullptr && node->right == nullptr) {
  53.                 if (node == root) {
  54.                     root = nullptr;
  55.                 }
  56.                 else {
  57.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  58.                 }
  59.                 delete node;
  60.             }
  61.             else if (node->left == nullptr) {
  62.                 node->right->parent = node->parent;
  63.                 if (node == root) {
  64.                     root = node->right;
  65.                 }
  66.                 else {
  67.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  68.                 }
  69.                 delete node;
  70.             }
  71.             else if (node->right == nullptr) {
  72.                 node->left->parent = node->parent;
  73.                 if (node == root) {
  74.                     root = node->left;
  75.                 }
  76.                 else {
  77.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  78.                 }
  79.                 delete node;
  80.             }
  81.             else {
  82.                 Node* temp = Min(node->right);
  83.                 if (temp->right) {
  84.                     temp->right->parent = temp->parent;
  85.                 }
  86.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  87.                 node->value = temp->value;
  88.                 node->count = temp->count;
  89.                 delete temp;
  90.             }
  91.         }
  92.     }
  93.  
  94.     Node* Min(Node* node) {
  95.         if (node != nullptr) {
  96.             while (node->left != nullptr) {
  97.                 node = node->left;
  98.             }
  99.         }
  100.         return node;
  101.     }
  102.  
  103.     Node* Max(Node* node) {
  104.         if (node != nullptr) {
  105.             while (node->right != nullptr) {
  106.                 node = node->right;
  107.             }
  108.         }
  109.         return node;
  110.     }
  111.  
  112.     void Print() {
  113.         Print(root);
  114.         cout << endl;
  115.     }
  116.  
  117.     void Print(Node* node) {
  118.         if (node != nullptr) {
  119.             Print(node->left);
  120.             for (int i = 0; i < node->count; i++) {
  121.                 cout << node->value << " ";
  122.             }
  123.             Print(node->right);
  124.         }
  125.     }
  126.  
  127.     int Size() {
  128.         return size;
  129.     }
  130.  
  131. private:
  132.     int size = 0;
  133.     Node* root = nullptr;
  134.  
  135. };
  136.  
  137. int main() {
  138.     Multiset<int> ms;
  139.  
  140.     int arr[]{ 45, 30, 50, 27, 39, 90, 30, 15, 30, 93 };
  141.     for (int i = 0; i < 10; i++) {
  142.         int val = arr[i];
  143.         cout << val << " ";
  144.         ms.Insert(val);
  145.     }
  146.     cout << endl << endl;
  147.  
  148.     cout << ms.Size() << endl;
  149.  
  150.     ms.Print();
  151.  
  152.     cout << ms.Size() << endl;
  153.  
  154.     ms.Erase(30);
  155.  
  156.     ms.Print();
  157.  
  158.     cout << ms.Size() << endl;
  159. }
  160.  
  161.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement