Advertisement
Guest User

v2_0

a guest
Nov 13th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.43 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #include <math.h>
  6. #define radix 10
  7. #pragma warning(disable:4996)
  8.  
  9. char array[20][120] = { NULL }; //массив для дерева
  10. int length; //длина пути
  11. int i = 0, n = 0;
  12. int m[10];
  13.  
  14. struct tree
  15. {
  16. int info; //значение элемента
  17. struct tree* left; //левый "сын"
  18. struct tree* right; //правый "сын"
  19. };
  20.  
  21. struct tree* root; //начальная вершина дерева
  22. struct tree* stree(struct tree* root, struct tree* r, int info); //добавление элемента в дерево
  23. struct tree* dtree(struct tree* root, int key); //удаление элемента из дерева
  24. void printtree(struct tree* root, int Len); //печать дерева в графическом режиме
  25. void inorder(struct tree* root, int i, int& max); //симметричный обход дерева
  26. void WriteArray(int step, int lvl, struct tree* root); //запись элементов в массив строк
  27.  
  28. void main()
  29. {
  30. int choose = -1;
  31. root = NULL; //инициализация корня дерева
  32.  
  33. //вывод меню
  34. while (choose != 5)
  35. {
  36. printf("1. Add element to tree\n");
  37. printf("2. Print a tree structure\n");
  38. printf("3. Max depth\n");
  39. printf("4. Exit\n");
  40. printf("Your choise: ");
  41. scanf("%d", &choose);
  42. printf("\n");
  43.  
  44. switch (choose)
  45. {
  46. case 1: {
  47. int value;
  48. printf("Enter integer value: ");
  49. scanf("%d", &value);
  50. root = stree(root, root, value);
  51. break;
  52. }
  53. case 2: {printtree(root,0); break; }
  54. case 3: {
  55. int max = 0;
  56. inorder(root, 0, max);
  57. printf("max= %d\n", max);
  58. break; }
  59. default: break;
  60. }
  61. }
  62. _getch();
  63. }
  64. //
  65. //Добавление элемента в дерево
  66. //struct tree *root - корень дерева
  67. //struct tree *r - вр. "корень"
  68. //int info - вносимый элемент
  69. struct tree* stree(struct tree* root, struct tree* r, int info)
  70. {
  71. //если исходный элемент пуст, то...
  72. if (!r)
  73. {
  74. //выделяем память под новый элемент
  75. r = (struct tree*)malloc(sizeof(struct tree));
  76. //если нет доступной памяти, то вывод ошибки
  77. if (!r)
  78. {
  79. printf("Не хватает памяти\n");
  80. exit(0);
  81. }
  82. //если все прошло успешно, то записываем данные
  83. r->left = NULL; //левая вершина пустая
  84. r->right = NULL; //права вершина пустая
  85. r->info = info; //заносим данные в корень
  86. //если "главный" корень пуст, то на его месте будет наш новый элемент
  87. if (!root) return r;
  88. //иначе продвигаемся по дереву, а затем делаем "внос" вершины
  89. if (info < root->info) root->left = r;
  90. else root->right = r;
  91. return r;
  92. }
  93.  
  94. //продвижение по дереву слева, чтобы занести элемент
  95. if (info < r->info)
  96. stree(r, r->left, info);
  97. //продвижение по дереву справа, чтобы занести элемент
  98. else
  99. stree(r, r->right, info);
  100.  
  101. return root;
  102. }
  103.  
  104.  
  105. //Удаление элемента из дерева
  106. //struct tree *root - корень дерева
  107. //int key - удаляемый элемент
  108. struct tree* dtree(struct tree* root, int key)
  109. {
  110. struct tree* p, * p2;
  111.  
  112. //если дерево пустое, то поиск невозможен
  113. if (!root) return root;
  114. //удаление корня
  115. if (root->info == key)
  116. {
  117. //это означает пустое дерево
  118. if (root->left == root->right)
  119. {
  120. free(root);
  121. return NULL;
  122. }
  123. //или если левое поддерево пустое
  124. else if (root->left == NULL)
  125. {
  126. p = root->right;
  127. free(root);
  128. return p;
  129. }
  130. //или если правое поддерево пустое
  131. else if (root->right == NULL)
  132. {
  133. p = root->left;
  134. free(root);
  135. return p;
  136. }
  137. //или у нас имеются оба поддерева
  138. else
  139. {
  140. p2 = root->right;
  141. p = root->right;
  142. while (p->left) p = p->left;
  143. p->left = root->left;
  144. free(root);
  145. return p2;
  146. }
  147. }
  148. if (root->info < key) root->right = dtree(root->right, key);
  149. else root->left = dtree(root->left, key);
  150. return root;
  151. }
  152.  
  153.  
  154. //Печать дерева в графическом режиме
  155. //struct tree *root - корень дерева
  156. void printtree(struct tree* root, int Len)
  157. {
  158. if (root != NULL)
  159. {
  160. printtree(root->right, Len + 1);
  161. for (int i = 0; i < Len; i++)
  162. printf(" ");
  163. printf("%2d\n", root->info);
  164. printtree(root->left, Len + 1);
  165. }
  166. }
  167.  
  168. //Вычисление максимальной глубины дерева
  169. void inorder(struct tree* root, int i, int& max)
  170. {
  171. //если дерево пустое, то обход невозможен
  172. if (!root) return;
  173. //иначе начинаем обход
  174. inorder(root->left, i + 1, max);
  175. if (root->left == NULL)
  176. {
  177. if (root->right == NULL) {
  178. if (max < i)
  179. max = i;
  180. }
  181. }
  182. inorder(root->right, i + 1, max);
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement