35657

Untitled

Jul 19th, 2024 (edited)
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.10 KB | None | 0 0
  1. /*
  2. Реализовать класс Set.
  3.  
  4. Для класса Set реализовать методы:
  5.  
  6. insert (вставка элемента)
  7. erase (удаление элемента)
  8. min (принимает указатель на родителя и возвращает минимальный элемент в ветке)
  9. max (принимает указатель на родителя и возвращает максимальный элемент в ветке)
  10. find (возвращает указатель на элемент либо nullptr если его нет)
  11. count (возвращает количество вхождений элемента в множество)
  12. next (возвращает указатель на следующий элемент)
  13. prev (возвращает указатель на предыдущий элемент)
  14. begin (возвращает указатель на первый элемент)
  15. end (возвращает указатель на последний элемент)
  16. clear (очистка списка)
  17. size (возвращает размер множества)
  18. print (вывод элементов множества в консоль в порядке возпастания)
  19. copy - для констр. и опер. копир (рекурсивная функция для копирования дерева)
  20. compare - для операторов сравнения (принимает два указателя на узлы и рекурсивно сравнивает содержимое)
  21. - переопределить операторы сравнения (==, !=)
  22. - реализовать конструктор по умолчанию, деструктор
  23. - реализовать конструктор копирования, копирующий оператор присваивания
  24. - реализовать конструктор перемещения, перемещающий оператор присваивания
  25. - сделать класс шаблонным
  26. */
  27.  
  28. #include <iostream>
  29.  
  30. using namespace std;
  31.  
  32. class Set {
  33.  
  34. public:
  35.  
  36.     struct Node {
  37.         int value;
  38.         Node* left;
  39.         Node* right;
  40.         Node* parent;
  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* 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.     Node* next(Node* node) {
  130.         if (node != nullptr) {
  131.             if (node->right != nullptr) {
  132.                 return min(node->right);
  133.             }
  134.             Node* temp = node->parent;
  135.             while (temp != nullptr && node->value > temp->value) {
  136.                 temp = temp->parent;
  137.             }
  138.             return temp;
  139.         }
  140.         return node;
  141.     }
  142.  
  143.     Node* prev(Node* node) {
  144.         if (node != nullptr) {
  145.             if (node->left != nullptr) {
  146.                 return max(node->left);
  147.             }
  148.             Node* temp = node->parent;
  149.             while (temp != nullptr && node->value < temp->value) {
  150.                 temp = temp->parent;
  151.             }
  152.             return temp;
  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.     void print() {
  167.         print(root_);
  168.         cout << endl;
  169.     }
  170.  
  171.     void clear() {
  172.         clear(root_);
  173.         root_ = nullptr;
  174.         size_ = 0;
  175.     }
  176.  
  177.     int size() const {
  178.         return size_;
  179.     }
  180.  
  181.     Node* begin() {
  182.         return min(root_);
  183.     }
  184.  
  185.     Node* end() {
  186.         return max(root_);
  187.     }
  188.  
  189.     Node* copy(Node* node, Node* parent) {
  190.         if (node == nullptr) {
  191.             return nullptr;
  192.         }
  193.         Node* temp = new Node{ node->value, nullptr, nullptr, parent };
  194.         temp->left = copy(node->left, temp);
  195.         temp->right = copy(node->right, temp);
  196.         return temp;
  197.     }
  198.  
  199.     // вариант сравнения деревьев на случай разной топологии но одинакового размера
  200.     bool compare(Node* a, Node* b) {
  201.         if (a == nullptr && b == nullptr) {
  202.             return true;
  203.         }
  204.         return  a->value == b->value && compare(next(a), next(b));
  205.     }
  206.  
  207. private:
  208.  
  209.     void print(Node* node) {
  210.         if (node != nullptr) {
  211.             print(node->left);
  212.             cout << node->value << " ";
  213.             print(node->right);
  214.         }
  215.     }
  216.  
  217.     void clear(Node* node) {
  218.         if (node != nullptr) {
  219.             clear(node->left);
  220.             clear(node->right);
  221.             delete node;
  222.         }
  223.     }
  224.  
  225.     Node* root_ = nullptr;
  226.     int size_ = 0;
  227. };
  228.  
  229.  
  230. int main() {
  231.  
  232.    // раскомментировать для проверки
  233.    /* setlocale(LC_ALL, "ru");
  234.  
  235.     Set<int> st{ 45,30,50,27,39,90,15,70,103 };
  236.  
  237.     st.print();
  238.     cout << st.size() << endl;
  239.  
  240.     st.print();
  241.     cout << st.size() << endl;
  242.  
  243.     Set<int> st2(st);
  244.  
  245.     st2.print();
  246.     cout << st2.size() << endl;
  247.  
  248.     cout << (st == st2) << endl;
  249.  
  250.     st2.erase(45);
  251.     st2.insert(45);
  252.  
  253.     st.print();
  254.     st2.print();
  255.  
  256.     cout << (st == st2) << endl;
  257.  
  258.     auto node = st2.find(30);
  259.  
  260.     if (node != nullptr) {
  261.         cout << node->value << endl;
  262.     }
  263.  
  264.     Set<string> st3{ "один", "два", "три", "четыре" };
  265.  
  266.     st3.print();*/
  267. }
Advertisement
Add Comment
Please, Sign In to add comment