35657

Untitled

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