Advertisement
35657

Untitled

Jun 26th, 2023 (edited)
487
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.57 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 = 0;
  11.         Node* left = nullptr;
  12.         Node* right = nullptr;
  13.         Node* parent = nullptr;
  14.     };
  15.  
  16.     void Insert(const int& val) {
  17.         if (root == nullptr) {
  18.             root = new Node{ val, nullptr, nullptr, nullptr };
  19.             size++;
  20.             return;
  21.         }
  22.         Node* parent = nullptr;
  23.         Node* node = root;
  24.         while (node != nullptr && node->value != val) {
  25.             parent = node;
  26.             node = node->value > val ? node->left : node->right;
  27.         }
  28.         if (node == nullptr) {
  29.             Node* temp = new Node{ val, nullptr, nullptr, parent };
  30.  
  31.             parent->value > val ? parent->left = temp : parent->right = temp;
  32.             size++;
  33.         }
  34.     }
  35.  
  36.     void Erase(const int& val) {
  37.         Node* parent = nullptr;
  38.         Node* node = root;
  39.         while (node != nullptr && node->value != val) {
  40.             parent = node;
  41.             node = node->value > val ? node->left : node->right;
  42.         }
  43.         if (node != nullptr) {
  44.             if (node->left == nullptr && node->right == nullptr) {
  45.                 if (node == root) {
  46.                     root = nullptr;
  47.                 }
  48.                 else {
  49.                     node == parent->right ? parent->right = nullptr : parent->left = nullptr;
  50.                 }
  51.                 delete node;
  52.             }
  53.             else if (node->left == nullptr) {
  54.                 node->right->parent = node->parent;
  55.                 if (node == root) {
  56.                     root = node->right;
  57.                 }
  58.                 else {
  59.                     node == parent->right ? parent->right = node->right : parent->left = node->right;
  60.                 }
  61.                 delete node;
  62.             }
  63.             else if (node->right == nullptr) {
  64.                 node->left->parent = node->parent;
  65.                 if (node == root) {
  66.                     root = node->left;
  67.                 }
  68.                 else {
  69.                     node == parent->right ? parent->right = node->left : parent->left = node->left;
  70.                 }
  71.                 delete node;
  72.             }
  73.             else {
  74.                 Node* temp = Min(node->right);
  75.                 if (temp->right) {
  76.                     temp->right->parent = temp->parent;
  77.                 }
  78.                 temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
  79.                 node->value = temp->value;
  80.                 delete temp;
  81.             }
  82.             size--;
  83.         }
  84.     }
  85.  
  86.     void Print() {
  87.         Print(root);
  88.         cout << endl;
  89.     }
  90.  
  91.     void Print(Node* node) {
  92.         if (node != nullptr) {
  93.             Print(node->left);
  94.             cout << node->value << " ";
  95.             Print(node->right);
  96.         }
  97.     }
  98.  
  99.     int Size() {
  100.         return size;
  101.     }
  102.  
  103.     Node* Min(Node* node) {
  104.         if (node != nullptr) {
  105.             while (node->left != nullptr) {
  106.                 node = node->left;
  107.             }
  108.         }
  109.         return node;
  110.     }
  111.  
  112.     Node* Max(Node* node) {
  113.         if (node != nullptr) {
  114.             while (node->right != nullptr) {
  115.                 node = node->right;
  116.             }
  117.         }
  118.         return node;
  119.     }
  120.  
  121.     Node* Find(const int& val) {
  122.         Node* node = root;
  123.         while (node != nullptr && node->value != val) {
  124.             node = node->value > val ? node->left : node->right;
  125.         }
  126.         return node;
  127.     }
  128.  
  129.     int Count(const int& val) {
  130.         return Find(val) == nullptr ? 0 : 1;
  131.     }
  132.  
  133.     Node* Next(Node* node) {
  134.         if (node) {
  135.             if (node->right) {
  136.                 return Min(node->right);
  137.             }
  138.             Node* parent = node->parent;
  139.             while (parent != nullptr && parent->value < node->value) {
  140.                 node = parent;
  141.                 parent = parent->parent;
  142.             }
  143.             return parent;
  144.         }
  145.     }
  146.  
  147. private:
  148.     int size = 0;
  149.     Node* root = nullptr;
  150. };
  151.  
  152.  
  153. void main() {
  154.     Set tr;
  155.     srand(time(NULL));
  156.     int arr[]{ 45, 30, 50, 27, 39, 90, 30, 15, 70, 93 };
  157.     for (int i = 0; i < 10; i++) {
  158.         //int val = rand() % 100;
  159.         int val = arr[i];
  160.         cout << val << " ";
  161.         tr.Insert(val);
  162.     }
  163.     cout << endl << endl;
  164.  
  165.     tr.Print();
  166.  
  167.     //tr.Erase(45);
  168.     tr.Print();
  169.  
  170.     auto node_ptr = tr.Find(39);
  171.     cout << node_ptr->value << endl;
  172.     auto node_next_ptr = tr.Next(node_ptr);
  173.     cout << node_next_ptr->value << endl;
  174.     cout << tr.Count(50) << endl;
  175.     cout << tr.Count(49) << endl;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement