Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.82 KB | None | 0 0
  1.  
  2. template <typename T>
  3. class set {
  4. public:
  5. class node {
  6. public:
  7. node* right;
  8. node* left;
  9. int key;
  10.  
  11. node() {
  12. key = 0;
  13. right = nullptr;
  14. left = nullptr;
  15. }
  16.  
  17. node(int key) {
  18. this->key = key;
  19. right = nullptr;
  20. left = nullptr;
  21. }
  22. };
  23.  
  24. node* root;
  25.  
  26. set() {
  27. root = nullptr;
  28. }
  29.  
  30. void push(node* parent, int key) {
  31. if (key > parent->key) {
  32. if (parent->right == nullptr)
  33. parent->right = new node(key);
  34. else
  35. push(parent->right, key);
  36. }
  37. else {
  38. if (key < parent->key) {
  39. if (parent->left == nullptr)
  40. parent->left = new node(key);
  41. else
  42. push(parent->left, key);
  43. }
  44. }
  45. }
  46.  
  47. void push(int key) {
  48. if (root == nullptr)
  49. root = new node(key);
  50. else
  51. push(root, key);
  52. }
  53.  
  54. void print(node* parent) {
  55. if (parent->left != nullptr)
  56. print(parent->left);
  57.  
  58. cout << "{" << parent->key << "} ";
  59.  
  60. if (parent->right != nullptr)
  61. print(parent->right);
  62. }
  63.  
  64. void print() {
  65. print(root);
  66. }
  67.  
  68.  
  69. node* find(node * parent, int key) {
  70. где-то <= или >= для multiset ???
  71. node* r = nullptr;
  72. if (key > parent->key) {
  73. if (parent->right != nullptr)
  74. r = find(parent->right, key);
  75. }
  76. else {
  77. if (key < parent->key) {
  78. if (parent->left != nullptr)
  79. r = find(parent->left, key);
  80. }
  81. else {
  82. r = parent;
  83. }
  84. }
  85.  
  86. return r;
  87. }
  88.  
  89. node* find(int key) {
  90. return find(root, key);
  91. }
  92.  
  93. static void set_intersection(set & s3, set & s2, node * parent) {
  94.  
  95. if (parent->left)
  96. set_intersection(s3, s2, parent->left);
  97.  
  98. node* f = s2.find(parent->key);
  99.  
  100. if (f != nullptr)
  101. s3.push(parent->key);
  102.  
  103. if (parent->right)
  104. set_intersection(s3, s2, parent->right);
  105. }
  106.  
  107. возращает те элементы которые пересечение
  108. static set set_intersection(set & s1, set & s2) {
  109. set s3;
  110.  
  111. set_intersection(s3, s2, s1.root);
  112.  
  113. return s3;
  114. }
  115.  
  116. объединение
  117. static void set_union(set & s3, node * parent) {
  118.  
  119. if (parent->left)
  120. set_union(s3, parent->left);
  121.  
  122. s3.push(parent->key);
  123.  
  124. if (parent->right)
  125. set_union(s3, parent->right);
  126.  
  127. }
  128.  
  129. Возвращает множество объединения s1 и s2
  130. static set set_union(set & s1, set & s2) {
  131. set s3;
  132.  
  133. set_union(s3, s1.root);
  134.  
  135. set_union(s3, s2.root);
  136.  
  137. return s3;
  138. }
  139.  
  140.  
  141. static void set_difference(set & s3, set & s2, node * parent) {
  142.  
  143. if (parent->left)
  144. set_difference(s3, s2, parent->left);
  145.  
  146. node* f = s2.find(parent->key);
  147. if (f == nullptr)
  148. s3.push(parent->key);
  149.  
  150. if (parent->right)
  151. set_difference(s3, s2, parent->right);
  152. }
  153. Находит одинаковые элементы в двух множествая и создает новое множество без них
  154. static set set_difference(set & s1, set & s2) {
  155. set s3;
  156.  
  157. set_difference(s3, s2, s1.root);
  158.  
  159. set_difference(s3, s1, s2.root);
  160.  
  161. return s3;
  162. }
  163.  
  164. class iterator {
  165. public:
  166. node* current;
  167. stack<node*> s;
  168.  
  169. iterator(node* n) {
  170. current = n;
  171. }
  172.  
  173. void findn() {
  174. if (current->right != NULL) {
  175. s.push(current);
  176. current = set::findl(current->right);
  177. }
  178. else {
  179. node* parent = current->parent;
  180.  
  181. if (!s.empty()) {
  182.  
  183. node* top = s.top();
  184. while (top == parent) {
  185. parent = top->parent;
  186. s.pop();
  187. if (s.empty())
  188. break;
  189. top = s.top();
  190. }
  191.  
  192. current = parent;
  193. }
  194. }
  195. }
  196.  
  197. bool operator !=(iterator other) {
  198. return current != other.current;
  199. }
  200. iterator operator++() {
  201. findn();
  202. return *this;
  203. }
  204.  
  205. iterator operator++(int) {
  206. findn();
  207. return *this;
  208. }
  209.  
  210. T operator *() {
  211. return current->key;
  212. }
  213. };
  214.  
  215. iterator begin() {
  216. return iterator(findl(root));
  217. }
  218.  
  219. iterator end() {
  220. return iterator(NULL);
  221. }
  222. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement