Advertisement
35657

Untitled

Apr 2nd, 2024
597
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.58 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.     // другой вариант конструктора копирования
  19.     /*Set(const Set& other) : root_(nullptr), size_(0) {
  20.         copy(other.root_);
  21.     }*/
  22.  
  23.     Set(const Set& other) : root_(copy(other.root_, nullptr)), size_(other.size_) {}
  24.  
  25.     void insert(const int& val) {
  26.         if (root_ == nullptr) {
  27.             root_ = new Node{ val, nullptr, nullptr, nullptr };
  28.             size_++;
  29.             return;
  30.         }
  31.         Node* parent = nullptr;
  32.         Node* node = root_;
  33.         while (node != nullptr && node->value != val) {
  34.             parent = node;
  35.             node = node->value > val ? node->left : node->right;
  36.         }
  37.         if (node == nullptr) {
  38.             node = new Node{ val, nullptr, nullptr, parent };
  39.             parent->value > val ? parent->left = node : parent->right = node;
  40.             size_++;
  41.         }
  42.     }
  43.  
  44.     void erase(const int& val) {
  45.         Node* parent = nullptr;
  46.         Node* node = root_;
  47.         while (node != nullptr && node->value != val) {
  48.             parent = node;
  49.             node = node->value > val ? node->left : node->right;
  50.         }
  51.         if (node != nullptr) {
  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.                 node->value = temp->value;
  84.                 if (temp->right != nullptr) {
  85.                     temp->right->parent = temp->parent;
  86.                 }
  87.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  88.                 delete temp;
  89.             }
  90.             size_--;
  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.     int size() const {
  118.         return size_;
  119.     }
  120.  
  121.     void clear() {
  122.         clear(root_);
  123.         root_ = nullptr;
  124.         size_ = 0;
  125.     }
  126.  
  127.     ~Set() {
  128.         clear(root_);
  129.     }
  130.  
  131. private:
  132.  
  133.     // другой вариант copy
  134.     /*void copy(Node* node) {
  135.         if (node != nullptr) {
  136.             insert(node->value);
  137.             copy(node->left);
  138.             copy(node->right);
  139.         }
  140.     }*/
  141.  
  142.     Node* copy(Node* node, Node* parent) {
  143.         if (node == nullptr) {
  144.             return nullptr;
  145.         }
  146.         Node* temp = new Node{ node->value, nullptr, nullptr, parent };
  147.         temp->left = copy(node->left, temp);
  148.         temp->right = copy(node->right, temp);
  149.         return temp;
  150.     }
  151.  
  152.     void clear(Node* node) {
  153.         if (node != nullptr) {
  154.             clear(node->left);
  155.             clear(node->right);
  156.             delete node;
  157.         }
  158.     }
  159.  
  160.     void print(Node* node) {
  161.         if (node != nullptr) {
  162.             print(node->left);
  163.             cout << node->value << " ";
  164.             // раскомментировать для проверки построения дерева
  165.            /* cout << " value " << node->value << " ";
  166.             if (node->parent) {
  167.                 cout << " parent " << node->parent->value;
  168.             }
  169.             else {
  170.                 cout << '\t';
  171.             }
  172.             if (node->left) {
  173.                 cout << " left " << node->left->value;
  174.             }
  175.             else {
  176.                 cout << '\t';
  177.             }
  178.             if (node->right) {
  179.                 cout << " right " << node->right->value;
  180.             }
  181.             else {
  182.                 cout << '\t';
  183.             }
  184.             cout << " " << node << endl;*/
  185.             print(node->right);
  186.         }
  187.     }
  188.  
  189.     Node* root_;
  190.     int size_;
  191. };
  192.  
  193.  
  194. int main() {
  195.  
  196.     int arr[]{ 45,30,50,27,39,90,15,70,103 };
  197.  
  198.     Set st;
  199.  
  200.     for (int i = 0; i < 9; i++) {
  201.         st.insert(arr[i]);
  202.     }
  203.  
  204.     st.print();
  205.     cout << st.size() << endl;
  206.  
  207.     st.erase(15);
  208.     st.erase(50);
  209.     st.erase(45);
  210.  
  211.     st.print();
  212.     cout << st.size() << endl;
  213.  
  214.     Set st2(st);
  215.  
  216.     st2.print();
  217.     cout << st2.size() << endl;
  218.  
  219. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement