Advertisement
Guest User

Untitled

a guest
Mar 30th, 2017
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. // ConsoleApplication3.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <iostream>
  7. #include <locale>
  8.  
  9. using namespace std;
  10.  
  11. int node_width = 0;
  12.  
  13. struct node // структура для представления узлов дерева
  14. {
  15. int key;
  16. unsigned char height;
  17. node* left;
  18. node* right;
  19. node(int k) { key = k; left = right = 0; height = 1; }
  20. };
  21.  
  22. void preorder(node *p) {
  23. if (p != NULL) {
  24. cout << p->key << "\t";
  25. preorder(p->left);
  26. preorder(p->right);
  27. }
  28.  
  29. }
  30.  
  31. unsigned char height(node* p)
  32. {
  33. return p ? p->height : 0;
  34. }
  35.  
  36. int bfactor(node* p)
  37. {
  38. return height(p->right) - height(p->left);
  39. }
  40.  
  41. void fixheight(node* p)
  42. {
  43. unsigned char hl = height(p->left);
  44. unsigned char hr = height(p->right);
  45. p->height = (hl>hr ? hl : hr) + 1;
  46. }
  47.  
  48. node* rotateright(node* p) // правый поворот вокруг p
  49. {
  50. node* q = p->left;
  51. p->left = q->right;
  52. q->right = p;
  53. fixheight(p);
  54. fixheight(q);
  55. return q;
  56. }
  57.  
  58. node* rotateleft(node* q) // левый поворот вокруг q
  59. {
  60. node* p = q->right;
  61. q->right = p->left;
  62. p->left = q;
  63. fixheight(q);
  64. fixheight(p);
  65. return p;
  66. }
  67.  
  68. node* balance(node* p) // балансировка узла p
  69. {
  70. fixheight(p);
  71. if (bfactor(p) == 2)
  72. {
  73. if (bfactor(p->right) < 0)
  74. p->right = rotateright(p->right);
  75. return rotateleft(p);
  76. }
  77. if (bfactor(p) == -2)
  78. {
  79. if (bfactor(p->left) > 0)
  80. p->left = rotateleft(p->left);
  81. return rotateright(p);
  82. }
  83. return p; // балансировка не нужна
  84. }
  85.  
  86. node* insert(node* p, int k) // вставка ключа k в дерево с корнем p
  87. {
  88. if (!p) return new node(k);
  89. if (k<p->key)
  90. p->left = insert(p->left, k);
  91. else
  92. p->right = insert(p->right, k);
  93. return balance(p);
  94. }
  95.  
  96. node* findmin(node* p) // поиск узла с минимальным ключом в дереве p
  97. {
  98. return p->left ? findmin(p->left) : p;
  99. }
  100.  
  101. node* removemin(node* p) // удаление узла с минимальным ключом из дерева p
  102. {
  103. if (p->left == 0)
  104. return p->right;
  105. p->left = removemin(p->left);
  106. return balance(p);
  107. }
  108.  
  109. node* remove(node* p, int k) // удаление ключа k из дерева p
  110. {
  111. if (!p) return 0;
  112. if (k < p->key)
  113. p->left = remove(p->left, k);
  114. else if (k > p->key)
  115. p->right = remove(p->right, k);
  116. else // k == p->key
  117. {
  118. node* q = p->left;
  119. node* r = p->right;
  120. delete p;
  121. if (!r) return q;
  122. node* min = findmin(r);
  123. min->right = removemin(r);
  124. min->left = q;
  125. return balance(min);
  126. }
  127. return balance(p);
  128. }
  129.  
  130.  
  131. int main() {
  132. setlocale(LC_ALL, "RU");
  133. node *root, *root1;
  134. int choice = 0;
  135. root = NULL;
  136. root1 = NULL;
  137. do {
  138. cout << "1 Вставить новый узел" << endl;
  139. cout << "2 Удалить элемент" << endl;
  140. cout << "3 Вывести дерево" << endl;
  141. cout << "4 Ширина дерева" << endl;
  142. cout << "5 Стереть данные" << endl;
  143. cout << "0 Выход" << endl;
  144. cout << "Выберите действие: ";
  145. cin >> choice;
  146. switch (choice) {
  147. case 1: {
  148. cout << "\n\t\tДобавление нового узла" << endl;
  149. cout << "Введите элемент: ";
  150. int a;
  151. cin >> a;
  152. root = insert(root, a);
  153. cout << "\nНовый элемент добавлен успешно\n" << endl;
  154. break;
  155. }
  156. case 2: {
  157. cout << "\nВведите удаляемый узел: ";
  158. int delel;
  159. cin >> delel;
  160. root = remove(root, delel);
  161. break;
  162. }
  163. case 3: {
  164. preorder(root);
  165. cout << endl;
  166. break;
  167. }
  168.  
  169. case 4: {
  170.  
  171. }
  172. case 5: {
  173.  
  174. }
  175. case 0: {
  176. cout << "\n\tВыход\n" << endl;
  177. break;
  178. }
  179. default: {
  180. cout << "Ошибка! Повторите ввод\n" << endl;
  181. break;
  182. }
  183. }
  184. system("pause");
  185. system("cls");
  186. } while (choice != 0);
  187. return 0;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement