Advertisement
35657

Untitled

Apr 4th, 2024
467
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.76 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. class Set {
  6.  
  7. public:
  8.  
  9.     struct Node {
  10.         int value;
  11.         Node* left;
  12.         Node* right;
  13.         Node* parent;
  14.     };
  15.  
  16.     Set() : root_(nullptr), size_(0) {}
  17.  
  18.     Set(const Set& other) : root_(copy(other.root_, nullptr)), size_(other.size_) {}
  19.  
  20.     Set(Set&& other) : root_(other.root_), size_(other.size_) {
  21.         other.root_ = nullptr;
  22.     }
  23.  
  24.     Set& operator=(const Set& other) {
  25.         if (this != &other) {
  26.             clear();
  27.             size_ = other.size_;
  28.             root_ = copy(other.root_, nullptr);
  29.         }
  30.         return *this;
  31.     }
  32.  
  33.     Set& operator=(Set&& other) {
  34.         if (this != &other) {
  35.             clear();
  36.             size_ = other.size_;
  37.             root_ = other.root_;
  38.             other.root_ = nullptr;
  39.         }
  40.         return *this;
  41.     }
  42.  
  43.     void insert(const int& val) {
  44.         if (root_ == nullptr) {
  45.             root_ = new Node{ val, nullptr, nullptr, nullptr };
  46.             size_++;
  47.             return;
  48.         }
  49.         Node* parent = nullptr;
  50.         Node* node = root_;
  51.         while (node != nullptr && node->value != val) {
  52.             parent = node;
  53.             node = node->value > val ? node->left : node->right;
  54.         }
  55.         if (node == nullptr) {
  56.             node = new Node{ val, nullptr, nullptr, parent };
  57.             parent->value > val ? parent->left = node : parent->right = node;
  58.             size_++;
  59.         }
  60.     }
  61.  
  62.     void erase(const int& val) {
  63.         Node* parent = nullptr;
  64.         Node* node = root_;
  65.         while (node != nullptr && node->value != val) {
  66.             parent = node;
  67.             node = node->value > val ? node->left : node->right;
  68.         }
  69.         if (node != nullptr) {
  70.             if (node->left == nullptr && node->right == nullptr) {
  71.                 if (node == root_) {
  72.                     root_ = nullptr;
  73.                 }
  74.                 else {
  75.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  76.                 }
  77.                 delete node;
  78.             }
  79.             else if (node->left == nullptr) {
  80.                 node->right->parent = node->parent;
  81.                 if (node == root_) {
  82.                     root_ = node->right;
  83.                 }
  84.                 else {
  85.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  86.                 }
  87.                 delete node;
  88.             }
  89.             else if (node->right == nullptr) {
  90.                 node->left->parent = node->parent;
  91.                 if (node == root_) {
  92.                     root_ = node->left;
  93.                 }
  94.                 else {
  95.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  96.                 }
  97.                 delete node;
  98.             }
  99.             else {
  100.                 Node* temp = min(node->right);
  101.                 node->value = temp->value;
  102.                 if (temp->right != nullptr) {
  103.                     temp->right->parent = temp->parent;
  104.                 }
  105.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  106.                 delete temp;
  107.             }
  108.             size_--;
  109.         }
  110.     }
  111.  
  112.     Node* min(Node* node) {
  113.         if (node != nullptr) {
  114.             while (node->left != nullptr) {
  115.                 node = node->left;
  116.             }
  117.         }
  118.         return node;
  119.     }
  120.  
  121.     Node* max(Node* node) {
  122.         if (node != nullptr) {
  123.             while (node->right != nullptr) {
  124.                 node = node->right;
  125.             }
  126.         }
  127.         return node;
  128.     }
  129.  
  130.     void print() {
  131.         print(root_);
  132.         cout << endl;
  133.     }
  134.  
  135.     int size() const {
  136.         return size_;
  137.     }
  138.  
  139.     void clear() {
  140.         clear(root_);
  141.         root_ = nullptr;
  142.         size_ = 0;
  143.     }
  144.  
  145.     bool operator==(const Set& other) {
  146.         return size_ == other.size_ ? compare(min(root_), min(other.root_)) : false;
  147.     }
  148.  
  149.     bool operator!=(const Set& other) {
  150.         return !(*this == other);
  151.     }
  152.  
  153.     ~Set() {
  154.         clear(root_);
  155.     }
  156.  
  157. private:
  158.  
  159.     // вариант сравнения деревьев на случай разной топологии но одинакового размера
  160.     bool compare(Node* a, Node* b) {
  161.         if (a == nullptr && b == nullptr) {
  162.             return true;
  163.         }
  164.         return  a->value == b->value && compare(next(a), next(b));
  165.     }
  166.  
  167.     Node* next(Node* node) {
  168.         if (node != nullptr) {
  169.             if (node->right != nullptr) {
  170.                 return min(node->right);
  171.             }
  172.             Node* temp = node->parent;
  173.             while (temp != nullptr && node->value > temp->value) {
  174.                 temp = temp->parent;
  175.             }
  176.             return temp;
  177.         }
  178.         return node;
  179.     }
  180.  
  181.     Node* copy(Node* node, Node* parent) {
  182.         if (node == nullptr) {
  183.             return nullptr;
  184.         }
  185.         Node* temp = new Node{ node->value, nullptr, nullptr, parent };
  186.         temp->left = copy(node->left, temp);
  187.         temp->right = copy(node->right, temp);
  188.         return temp;
  189.     }
  190.  
  191.     void clear(Node* node) {
  192.         if (node != nullptr) {
  193.             clear(node->left);
  194.             clear(node->right);
  195.             delete node;
  196.         }
  197.     }
  198.  
  199.     void print(Node* node) {
  200.         if (node != nullptr) {
  201.             print(node->left);
  202.             cout << node->value << " ";
  203.             // раскомментировать для проверки построения дерева
  204.            /* cout << " value " << node->value << " ";
  205.             if (node->parent) {
  206.                 cout << " parent " << node->parent->value;
  207.             }
  208.             else {
  209.                 cout << '\t';
  210.             }
  211.             if (node->left) {
  212.                 cout << " left " << node->left->value;
  213.             }
  214.             else {
  215.                 cout << '\t';
  216.             }
  217.             if (node->right) {
  218.                 cout << " right " << node->right->value;
  219.             }
  220.             else {
  221.                 cout << '\t';
  222.             }
  223.             cout << " " << node << endl;*/
  224.             print(node->right);
  225.         }
  226.     }
  227.  
  228.     Node* root_;
  229.     int size_;
  230. };
  231.  
  232.  
  233. int main() {
  234.  
  235.     int arr[]{ 45,30,50,27,39,90,15,70,103 };
  236.  
  237.     Set st;
  238.  
  239.     for (int i = 0; i < 9; i++) {
  240.         st.insert(arr[i]);
  241.     }
  242.  
  243.     st.print();
  244.     cout << st.size() << endl;
  245.  
  246.     st.print();
  247.     cout << st.size() << endl;
  248.  
  249.     Set st2(st);
  250.  
  251.     st2.print();
  252.     cout << st2.size() << endl;
  253.  
  254.     cout << (st == st2) << endl;
  255.  
  256.     st2.erase(45);
  257.     st2.insert(45);
  258.  
  259.     st.print();
  260.     st2.print();
  261.  
  262.     cout << (st == st2) << endl;
  263. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement