Advertisement
35657

Untitled

Mar 30th, 2024
564
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.71 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.     void insert(const int& val) {
  19.         if (root_ == nullptr) {
  20.             root_ = new Node{ val, nullptr, nullptr, nullptr };
  21.             size_++;
  22.             return;
  23.         }
  24.         Node* parent = nullptr;
  25.         Node* node = root_;
  26.         while (node != nullptr && node->value != val) {
  27.             parent = node;
  28.             node = node->value > val ? node->left : node->right;
  29.         }
  30.         if (node == nullptr) {
  31.             node = new Node{ val, nullptr, nullptr, parent };
  32.             parent->value > val ? parent->left = node : parent->right = node;
  33.             size_++;
  34.         }
  35.     }
  36.  
  37.     void erase(const int& val) {
  38.         Node* parent = nullptr;
  39.         Node* node = root_;
  40.         while (node != nullptr && node->value != val) {
  41.             parent = node;
  42.             node = node->value > val ? node->left : node->right;
  43.         }
  44.         if (node != nullptr) {
  45.             if (node->left == nullptr && node->right == nullptr) {
  46.                 if (node == root_) {
  47.                     root_ = nullptr;
  48.                 }
  49.                 else {
  50.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  51.                 }
  52.                 delete node;
  53.             }
  54.             else if (node->left == nullptr) {
  55.                 node->right->parent = node->parent;
  56.                 if (node == root_) {
  57.                     root_ = node->right;
  58.                 }
  59.                 else {
  60.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  61.                 }
  62.                 delete node;
  63.             }
  64.             else if (node->right == nullptr) {
  65.                 node->left->parent = node->parent;
  66.                 if (node == root_) {
  67.                     root_ = node->left;
  68.                 }
  69.                 else {
  70.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  71.                 }
  72.                 delete node;
  73.             }
  74.             else {
  75.                 Node* temp = min(node->right);
  76.                 node->value = temp->value;
  77.                 if (temp->right != nullptr) {
  78.                     temp->right->parent = temp->parent;
  79.                 }
  80.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  81.                 delete temp;
  82.             }
  83.             size_--;
  84.         }
  85.     }
  86.  
  87.     Node* min(Node* node) {
  88.         if (node != nullptr) {
  89.             while (node->left != nullptr) {
  90.                 node = node->left;
  91.             }
  92.         }
  93.         return node;
  94.     }
  95.  
  96.     Node* max(Node* node) {
  97.         if (node != nullptr) {
  98.             while (node->right != nullptr) {
  99.                 node = node->right;
  100.             }
  101.         }
  102.         return node;
  103.     }
  104.  
  105.     void print() {
  106.         print(root_);
  107.         cout << endl;
  108.     }
  109.  
  110.     int size() const {
  111.         return size_;
  112.     }
  113.  
  114. private:
  115.  
  116.     void print(Node* node) {
  117.         if (node != nullptr) {
  118.             print(node->left);
  119.             cout << node->value << " ";
  120.             print(node->right);
  121.         }
  122.     }
  123.  
  124.     Node* root_;
  125.     int size_;
  126. };
  127.  
  128.  
  129. int main() {
  130.  
  131.     int arr[]{ 45,30,50,27,39,90,15,70,103 };
  132.  
  133.     Set st;
  134.  
  135.     for (int i = 0; i < 9; i++) {
  136.         st.insert(arr[i]);
  137.     }
  138.  
  139.     st.print();
  140.     cout << st.size() << endl;
  141.  
  142.     st.erase(15);
  143.     st.erase(50);
  144.     st.erase(45);
  145.  
  146.     st.print();
  147.     cout << st.size() << endl;
  148.  
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement