Advertisement
35657

Untitled

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