Удаление элемента из бинарного дерева - C (СИ)

Узнай цену своей работы

Формулировка задачи:

в программе выполняется пару ф-й, не работает удаление элемента (в меню пункт 1), должен удалить узел где длина кода более 5, при попытке удалить крайней листок не имеющий потомков выдает, а ежели удалять элементы имеющие потомков, то когда печатает дерево выдает ту же ошибку, даю файл с деревом и ВЕСЬ код программы. т.е. не работают: void DeleteNode (Tree ** root_adr); код сбалансированного дерева " balanced[1]": h 001 d 002 l 003 b 004 f 005 j 006 n 007 a 008 c 009 e 010 g 011 i 0121212 k 013 m 014 o 015 код не сбалансированного дерева "not balanced[2]" : d 01 b 02 j 03 a 04 c 05 g 06 m 007 f 080808 h 09 l 10 n 11 e 12 o 13
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. typedef struct key_combinations
  5. {
  6. char *key;
  7. char *combination;
  8. } KEY_COMBINATION;
  9.  
  10. typedef struct tree
  11. {
  12. KEY_COMBINATION kc;
  13. struct tree *left,*right;
  14. }Tree;
  15. Tree *root;
  16. Tree ** stack;
  17. void AddNode (Tree * proot, Tree * pnew) ;
  18. void GetData ();
  19. void PrintTree();
  20. void ShowTree(Tree *rooot, int lvl);
  21. void PutTree(Tree *rooot);
  22. void ifMore(Tree *rooot);
  23. void DeleteNode (Tree ** root_adr);
  24. void FreeNode (Tree * node) ;
  25. int TreeHeight(Tree * proot);
  26. void DigitNumber(Tree * proot);
  27. void RightToTop(Tree **root_adr);
  28. void DeleteTree(Tree *rooot) ;
  29. int main()
  30. {
  31. GetData ();
  32. PrintTree();
  33. int menu=1,len=0;
  34. while(menu>0)
  35. {
  36. printf("\n\n delete where len>5 [1]\n right ot top [2] \n iteretion funk [3] \n free && exit [0] \n ");
  37. scanf("%d",&menu);
  38. switch(menu)
  39. {
  40. case 1:
  41. ifMore(root);
  42. PrintTree();
  43. break;
  44. case 2:
  45. len=TreeHeight(root);
  46. printf("\n Tree height = %d with root : %s",len,root->kc.key);
  47. RightToTop(&root);
  48. len=TreeHeight(root);
  49. printf("\n Tree height = %d with root : %s",len,root->kc.key);
  50. break;
  51. case 3:
  52. stack=(Tree **)calloc(TreeHeight(root), sizeof(Tree *));
  53. DigitNumber(root);
  54. break;
  55. case 0:
  56. DeleteTree(root);
  57. break;
  58. }
  59. }
  60. return 0;
  61. }
  62. void GetData ()
  63. {
  64. Tree * pel;
  65. KEY_COMBINATION * pkc;
  66. char bufk[3],bufc[25];
  67. FILE* f;
  68. pkc = (KEY_COMBINATION *)malloc(sizeof(KEY_COMBINATION));
  69. int choise;
  70. printf("choose file balanced[1] not balanced[2] : ");
  71. scanf("%d",&choise);
  72. if(choise==2)
  73. f = fopen("TreeNB","r");
  74. else
  75. f = fopen("TreeB","r");
  76. while(fscanf(f,"%s%s",bufk,bufc)!=EOF)
  77. {
  78. //printf("\n %s %s",bufk,bufc);
  79. pkc->key = (char * ) malloc(strlen(bufk)+1);
  80. strcpy(pkc->key, bufk);
  81. pkc->combination =(char * ) malloc(strlen(bufc)+1);
  82. strcpy(pkc->combination, bufc);
  83. pel = (Tree *)malloc(sizeof(Tree));
  84. pel->kc = * pkc;
  85. pel->left = NULL;
  86. pel->right = NULL;
  87. AddNode(root,pel);
  88. }
  89. }
  90. void AddNode (Tree * proot, Tree * pnew)
  91. {
  92. if (root == NULL)
  93. root = pnew;
  94. else
  95. if (strcmp(proot->kc.key, pnew->kc.key)>0)
  96. if (proot->left == NULL)
  97. proot->left = pnew;
  98. else
  99. AddNode(proot->left, pnew);
  100. else
  101. if (proot->right == NULL)
  102. proot->right = pnew;
  103. else
  104. AddNode(proot->right, pnew);
  105. }
  106. void PrintTree()
  107. {
  108. puts("\n===============================");
  109. PutTree(root);
  110. puts("\n===============================\n");
  111. ShowTree(root,1);
  112. puts("===============================");
  113. }
  114. void ShowTree(Tree *rooot, int lvl)
  115. {
  116. if(rooot==NULL)
  117. return;
  118. ShowTree(rooot->right,lvl+1);
  119. printf("%*c%s\n", lvl*3,' ', rooot->kc.key);
  120. ShowTree(rooot->left,lvl+1);
  121. }
  122. void PutTree(Tree *rooot)
  123. {
  124. if(rooot==NULL)
  125. return;
  126. printf("\n\t%s -\t%s", rooot->kc.key, rooot->kc.combination);
  127. PutTree(rooot->left);
  128. PutTree(rooot->right);
  129. }
  130. void ifMore(Tree *rooot)
  131. {
  132. if(rooot==NULL)
  133. return;
  134. if(strlen(rooot->kc.combination)>5)
  135. {
  136. printf("found %s",rooot->kc.key);
  137. printf("\n %s-%s", rooot->kc.key, rooot->kc.combination);
  138. DeleteNode(&rooot);
  139. ifMore(rooot);
  140. }
  141. ifMore(rooot->left);
  142. ifMore(rooot->right);
  143. }
  144. void FreeNode (Tree * node)
  145. {
  146. free(node->kc.key);
  147. free(node->kc.combination);
  148. free(node);
  149. }
  150. int TreeHeight(Tree * proot)
  151. {
  152. int lh,rh;
  153. if (proot == NULL)
  154. return 0;
  155. lh = TreeHeight(proot->left);
  156. rh = TreeHeight(proot->right);
  157. return lh > rh ? lh+1 : rh+1;
  158. }
  159. void DigitNumber(Tree * proot)
  160. {
  161. int i=0;
  162. Tree * pdel = root, * pnext;
  163. while (pdel!= NULL) {
  164. if (pdel->left!= NULL)
  165. { pnext = pdel->left;
  166. if (pdel->right!= NULL)
  167. stack[++i] = pdel->right;
  168. }
  169. else
  170. if (pdel->right!= NULL)
  171. pnext = pdel->right;
  172. else
  173. pnext = stack[i--];
  174. int n = strlen(pdel->kc.combination);
  175. printf("%s -%s - digit number = %d\n ",pdel->kc.key,pdel->kc.combination,n);
  176. pdel = pnext;
  177. }
  178. }
  179. void RightToTop(Tree **root_adr)
  180. {
  181. Tree *proot = *root_adr,*pright = *root_adr,*prev;
  182. while(pright->right!=NULL)
  183. {
  184. prev=pright;
  185. pright=pright->right;
  186. }
  187. prev->right=NULL;
  188. pright->left=proot;
  189. *root_adr=pright;
  190. }
  191. void DeleteNode (Tree ** root_adr)
  192. {
  193. Tree * proot = *root_adr, * pright, * padd;
  194. int cmp, subtr;
  195. if (proot == NULL) return;
  196. if (proot->left == NULL && proot->right == NULL)
  197. subtr = 0;
  198. else if (proot->left == NULL)
  199. subtr = 1;
  200. else if (proot->right == NULL)
  201. subtr = -1;
  202. else
  203. subtr = 2;
  204. switch (subtr)
  205. {
  206. case 0:
  207. *root_adr = NULL;
  208. break;
  209. case -1:
  210. *root_adr = proot->left;
  211. break;
  212. case 1:
  213. *root_adr = proot->right;
  214. break;
  215. case 2:
  216. *root_adr = proot->left;
  217. pright = proot->left->right;
  218. padd = proot->left->right=proot->right ;
  219. proot->right=NULL;
  220. while (padd->left!= NULL)
  221. padd = padd->left;
  222. padd->left = pright;
  223. break;
  224. }
  225. FreeNode(proot);
  226. printf(" free..");
  227. }
  228. void DeleteTree(Tree *rooot)
  229. {
  230. if(rooot==NULL)
  231. return;
  232. DeleteTree(rooot->left);
  233. DeleteTree(rooot->right);
  234. free(rooot);
  235. }

Решение задачи: «Удаление элемента из бинарного дерева»

textual
Листинг программы
  1. void Del(ELT *q)
  2. {
  3.      if(q!=NULL)
  4.       {
  5.         Del(q->left);
  6.         Del(q->reght);
  7.         free(q);
  8.       }
  9. }

Объяснение кода листинга программы

  1. В функции Del аргументом является указатель на узел q.
  2. Если q не равен NULL, то выполняется рекурсивный вызов функции Del для левого поддерева q->left.
  3. После этого выполняется рекурсивный вызов функции Del для правого поддерева q->right.
  4. Затем освобождается память, выделенная под узел q, с помощью функции free.
  5. Если q равен NULL, то ничего не происходит.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы