Advertisement
Zennoma

laba18

Jun 3rd, 2020
695
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.60 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include "ctime"
  4. #include "math.h"
  5. #include <tchar.h>
  6. #include <cstring>
  7. #include "stdlib.h"
  8. #include <string>
  9. #include "conio.h"
  10. #include <fstream>
  11.  
  12. using namespace std;
  13.  
  14. struct Node { //структура бинарного дерева
  15. int value; //поле данных
  16. Node* left; //указатель на левый потомок
  17. Node* right; //указатель на правый
  18.  
  19. };
  20.  
  21.  
  22.  
  23. Node* BTree = NULL; //с
  24.  
  25. void print(Node* MyTree) {
  26. if (MyTree != NULL) //обращение к информационному полю узла
  27. {
  28. cout << MyTree->value << " ";
  29. print(MyTree->left);
  30. print(MyTree->right);
  31. }
  32. }
  33.  
  34. //&MyTree, TreeElement
  35.  
  36.  
  37.  
  38. void AddNode(Node** MyTree, Node* TreeElement) //рекурсивная функция создания/добавления вершины дерева
  39. {
  40. int p = 0;
  41. int q = 0;
  42. Node* current;
  43. int A, B;
  44. A = TreeElement->value;
  45. current = *MyTree; //вспомогательный указатель на указатель дерева
  46. if (current == NULL)
  47. *MyTree = TreeElement; //если узла нет, создаем узел
  48. else {
  49. B = current->value;
  50. while (A) {
  51. if (A % 10 % 2 == 0) p += A % 10;
  52. A /= 10;
  53. }
  54. while (B) {
  55. if (B % 10 % 2 == 0) q += B % 10;
  56. B /= 10;
  57. }
  58. //если значение текущего узла поддерева меньше значения узла дерева,
  59. if (p < q) { //то зависываем значение узла в левое поддерево
  60. AddNode(&current->left, TreeElement);
  61. }
  62. else {
  63. AddNode(&current->right, TreeElement);
  64. } //иначе зависываем значение узла в правое поддерево
  65. }
  66. }
  67. void PrintTree(Node* tree, int space)
  68. {
  69. const int COUNT = 5;
  70. if (tree != NULL)
  71. {
  72. space += COUNT;
  73. PrintTree(tree->right, space);
  74. for (int i = COUNT; i < space; i++)
  75. printf("%c", ' ');
  76. printf_s("%d\n", tree->value);
  77. PrintTree(tree->left, space);
  78. }
  79. }
  80. void randomic(int* a, int n)
  81. {
  82. int t;
  83. puts("generated list");
  84. for (int i = 0; i < n; i++)
  85. {
  86. t = rand() % 100 + 2452;
  87. a[i] = t;
  88. printf_s("%d ", t);
  89. }
  90. printf_s("\n");
  91. }
  92.  
  93. void Del1(Node** r, Node** q) // вспомогательная функция для удаления вершины
  94. {
  95. Node* s;
  96. if ((*r)->right == NULL)
  97. {
  98. (*q)->value = (*r)->value;
  99. *q = *r;
  100. s = *r;
  101. *r = (*r)->left;
  102. delete s;
  103. }
  104. else Del1(&((*r)->right), q);
  105. }
  106.  
  107.  
  108. void Del_Node(Node** MyTree, int k) // удаление вершины из дерева
  109. {
  110. Node* current, * q;
  111. current = *MyTree;
  112. if (*MyTree == NULL)
  113. cout << endl << "Элемент с таким значением не найден" << endl;
  114. else
  115. if (k < (current)->value)
  116. Del_Node(&current->left, k); //если вершина является листом
  117. else
  118. if (k > (current)->value)
  119. Del_Node(&current->right, k);
  120. else {
  121. q = *MyTree;
  122. if (q->right == NULL) {
  123. *MyTree = q->left;
  124. delete q;
  125. } //если вершина имеет одну дочернюю вершину
  126. else
  127. if (q->left == NULL) {
  128. *MyTree = q->right; delete q;
  129. } //если у вершины две дочерних вершины
  130. else Del1(&q->left, &q);
  131.  
  132. }
  133. }
  134.  
  135.  
  136.  
  137. void* Poisk(Node* MyTree)
  138. {
  139. if (MyTree == NULL)
  140. return NULL;
  141. else
  142. if (MyTree->value % 3 == 0)
  143. {
  144. cout << MyTree->value << " ";
  145. Del_Node(&MyTree, MyTree->value);
  146.  
  147. }
  148. Poisk(MyTree->left);
  149. Poisk(MyTree->right);
  150.  
  151.  
  152. }
  153.  
  154. void Del_Mem(Node** MyTree) // очистка памяти
  155. {
  156. Node* current;
  157. current = *MyTree;
  158. if (*MyTree != NULL) {
  159. Del_Mem(&(*MyTree)->left);
  160. Del_Mem(&(*MyTree)->right);
  161. delete* MyTree;
  162. }
  163. }
  164. Node* add(int value) //Инициализация
  165. {
  166. Node* TreeElement = new Node; //выделение памяти под узел дерева
  167. TreeElement->value = value; //запись значения в узел дерева
  168. TreeElement->left = NULL; //задание пустого левого поддерева
  169. TreeElement->right = NULL; //задание пустого правого поддерева
  170. return TreeElement;
  171. }
  172. Node* insert(Node* MyTree, int key) //Функция добавления узлов в бинарное дерево поиска (BST)
  173. {
  174. if (MyTree == NULL)
  175. return add(key);
  176. if (key < MyTree->value)
  177. MyTree->left = insert(MyTree->left, key);
  178. else if (key > MyTree->value)
  179. MyTree->right = insert(MyTree->right, key);
  180. return MyTree;
  181. }
  182.  
  183. int main()
  184. {
  185. int x;
  186. int p=0;
  187. setlocale(0, "rus");
  188. srand(time(0));
  189. int n;
  190. cout << "Введите кол-во элементов дерева ";
  191. cin >> n;
  192. int* a = new int[n];
  193. Node* MyTree = NULL; //указатель, тип которого соответсвует узлу дерева, в начале создается пустое дерево
  194. Node* TreeElement;
  195. int next_number; //вводимые значения узлов дерева
  196.  
  197. randomic(a, n);
  198. for (int i = 0; i < n; i++)
  199. {
  200. next_number = a[i];
  201. TreeElement = new Node; //выделение памяти под узел дерева
  202. TreeElement->value = next_number; //запись значения в узел дерева
  203. TreeElement->left = NULL; //задание пустого левого поддерева
  204. TreeElement->right = NULL; //задание пустого правого поддерева
  205. AddNode(&MyTree, TreeElement); // добавление узла TreeElement в дерево MyTree
  206. }
  207.  
  208. int temp;
  209. cout << "Полученное бинарное дерево:" << endl;
  210. PrintTree(MyTree, 0);
  211. //cout << endl << "Элементы, которые делятся на 3 " << endl;
  212. for (int i = 0; i <= n; i++)
  213. {
  214. temp = a[i];
  215. while (a[i]) {
  216.  
  217. if (a[i] % 10 % 2 != 0) p = 1 ;
  218. a[i] /= 10;
  219. }
  220.  
  221. if (p!=1)
  222. {
  223. Del_Node(&MyTree, temp);
  224. }
  225. }
  226. cout << endl << "Бинарное дерево после выполнения задания :" << endl;
  227. print(MyTree);
  228. cout << endl << "Если вы хотите добавить элементы, то нажмите 1 или программа завершится" << endl;
  229. cin >> x;
  230. if (x == 1)
  231. {
  232. cout << "Сколько элементов вы хотите задать?" << endl;
  233. cin >> n;
  234. cout << "Задайте элементы" << endl;
  235. for (int i = 0; i < n; i++)
  236. {
  237. cin >> x;
  238. if (i == 0) MyTree = insert(MyTree, x);
  239. else insert(MyTree, x);
  240.  
  241. }
  242.  
  243.  
  244. }
  245. cout << endl;
  246. PrintTree(MyTree,0);
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement