Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- using namespace std;
- template <typename T>
- class Set {
- public:
- struct Node {
- T value{};
- Node* left = nullptr;
- Node* right = nullptr;
- Node* parent = nullptr;
- };
- Set() : size(0), root(nullptr) {}
- Set(const Set& other) : size(other.size), root(Copy(other.root, nullptr)) {}
- Set(Set&& other) : size(other.size), root(other.root) {
- other.size = 0;
- other.root = nullptr;
- }
- Set& operator=(const Set& other) {
- if (this != &other) {
- Clear();
- size = other.size;
- root = Copy(other.root, nullptr);
- }
- return *this;
- }
- Set& operator=(Set&& other) {
- if (this != &other) {
- Clear();
- size = other.size;
- root = other.root;
- other.root = nullptr;
- other.size = 0;
- }
- return *this;
- }
- void Insert(const T& val) {
- if (root == nullptr) {
- root = new Node{ val, nullptr, nullptr, nullptr };
- size++;
- return;
- }
- Node* parent = nullptr;
- Node* node = root;
- while (node != nullptr && node->value != val) {
- parent = node;
- node = node->value > val ? node->left : node->right;
- }
- if (node == nullptr) {
- Node* temp = new Node{ val, nullptr, nullptr, parent };
- parent->value > val ? parent->left = temp : parent->right = temp;
- size++;
- }
- }
- void Erase(const T& val) {
- Node* parent = nullptr;
- Node* node = root;
- while (node != nullptr && node->value != val) {
- parent = node;
- node = node->value > val ? node->left : node->right;
- }
- if (node != nullptr) {
- if (node->left == nullptr && node->right == nullptr) {
- if (node == root) {
- root = nullptr;
- }
- else {
- node == parent->right ? parent->right = nullptr : parent->left = nullptr;
- }
- delete node;
- }
- else if (node->left == nullptr) {
- node->right->parent = node->parent;
- if (node == root) {
- root = node->right;
- }
- else {
- node == parent->right ? parent->right = node->right : parent->left = node->right;
- }
- delete node;
- }
- else if (node->right == nullptr) {
- node->left->parent = node->parent;
- if (node == root) {
- root = node->left;
- }
- else {
- node == parent->right ? parent->right = node->left : parent->left = node->left;
- }
- delete node;
- }
- else {
- Node* temp = Min(node->right);
- if (temp->right) {
- temp->right->parent = temp->parent;
- }
- temp == temp->parent->right ? temp->parent->right = temp->right : temp->parent->left = temp->right;
- node->value = temp->value;
- delete temp;
- }
- size--;
- }
- }
- void Print() {
- Print(root);
- cout << endl;
- }
- void Print(Node* node) {
- if (node != nullptr) {
- Print(node->left);
- cout << node->value << " ";
- Print(node->right);
- }
- }
- void Clear() {
- Clear(root);
- root = nullptr;
- size = 0;
- }
- void Clear(Node* node) {
- if (node != nullptr) {
- Clear(node->left);
- Clear(node->right);
- delete node;
- }
- }
- int Size() {
- return size;
- }
- Node* Min(Node* node) {
- if (node != nullptr) {
- while (node->left != nullptr) {
- node = node->left;
- }
- }
- return node;
- }
- Node* Max(Node* node) {
- if (node != nullptr) {
- while (node->right != nullptr) {
- node = node->right;
- }
- }
- return node;
- }
- Node* Copy(Node* node, Node* parent) {
- if (node == nullptr) {
- return node;
- }
- Node* temp = new Node{ node->value, nullptr, nullptr, parent };
- temp->left = Copy(node->left, temp);
- temp->right = Copy(node->right, temp);
- return temp;
- }
- bool Compare(Node* a, Node* b) {
- Node* left = Min(a);
- Node* right = Min(b);
- while (left != nullptr && right != nullptr) {
- if (left->value != right->value) {
- return false;
- }
- left = Next(left);
- right = Next(right);
- }
- if (left == nullptr && right != nullptr || right == nullptr && left != nullptr) {
- return false;
- }
- return true;
- }
- Node* Begin() {
- return Min(root);
- }
- Node* End() {
- return Max(root);
- }
- Node* Find(const T& val) {
- Node* node = root;
- while (node != nullptr && node->value != val) {
- node = node->value > val ? node->left : node->right;
- }
- return node;
- }
- int Count(const T& val) {
- return Find(val) == nullptr ? 0 : 1;
- }
- Node* Next(Node* node) {
- if (node) {
- if (node->right) {
- return Min(node->right);
- }
- Node* parent = node->parent;
- while (parent != nullptr && parent->value < node->value) {
- parent = parent->parent;
- }
- return parent;
- }
- }
- Node* Prev(Node* node) {
- if (node) {
- if (node->left) {
- return Max(node->right);
- }
- Node* parent = node->parent;
- while (parent != nullptr && parent->value > node->value) {
- parent = parent->parent;
- }
- return parent;
- }
- }
- bool operator==(const Set& other) {
- if (size != other.size) {
- return false;
- }
- return Compare(root, other.root);
- }
- bool operator!=(const Set& other) {
- return !(*this == other);
- }
- ~Set() {
- Clear();
- }
- private:
- int size = 0;
- Node* root = nullptr;
- };
- void main() {
- Set<int> tr;
- srand(time(NULL));
- int arr[]{ 45, 30, 50, 27, 39, 90, 30, 15, 70, 93 };
- for (int i = 0; i < 10; i++) {
- //int val = rand() % 100;
- int val = arr[i];
- cout << val << " ";
- tr.Insert(val);
- }
- cout << endl << endl;
- cout << "_1_" << endl;
- tr.Print();
- cout << "_2_" << endl;
- tr.Erase(30);
- tr.Print();
- cout << "_3_" << endl;
- Set<int> tr2;
- tr2 = move(tr);
- tr2.Print();
- cout << "_4_" << endl;
- tr2.Insert(33);
- tr2.Print();
- cout << "_5_" << endl;
- tr2.Insert(41);
- tr2.Insert(42);
- tr2.Print();
- cout << "_6_" << endl;
- tr2.Erase(33);
- tr2.Print();
- cout << "_7_" << endl;
- tr2.Insert(40);
- tr2.Insert(47);
- tr2.Print();
- cout << "_8_" << endl;
- tr2.Erase(15);
- tr2.Print();
- cout << "_9_" << endl;
- tr2.Erase(45);
- tr2.Print();
- cout << "_10_" << endl;
- tr2.Erase(93);
- tr2.Print();
- cout << "_11_" << endl;
- tr.Print();
- tr.Clear();
- cout << "clear" << endl;
- tr.Print();
- cout << "_12_" << endl;
- auto a = tr2.Find(50);
- cout << a->value << endl;
- cout << tr2.Count(50) << endl;
- cout << tr2.Count(16) << endl;
- cout << "_13_" << endl;
- Set<int> tr3 = tr2;
- tr3.Insert(35);
- tr3.Print();
- cout << boolalpha;
- cout << (tr2 == tr3) << endl;
- cout << (tr2 != tr3) << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment