Advertisement
Guest User

Untitled

a guest
May 23rd, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.29 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. /* definire structura arbore */
  4. struct NOD
  5. {
  6. int x;
  7. struct NOD *NOD_stanga;
  8. struct NOD *NOD_dreapta;
  9. };
  10. /* functie creare nod nou */
  11. struct NOD *creare_nod(int x)
  12. {
  13. struct NOD *nod_nou;
  14. /* alocare memorie nod*/
  15. nod_nou=(struct NOD *)malloc(sizeof(struct NOD));
  16. if (nod_nou==NULL)
  17. {
  18. printf("Eroare: Memoria nu a putut fi alocata! \n");
  19. return NULL;
  20. }
  21. /* initializare informatii */
  22. nod_nou->x=x;
  23. nod_nou->NOD_stanga=NULL;
  24. nod_nou->NOD_dreapta=NULL;
  25. return nod_nou;
  26. }
  27. /* inserare nod in arbore */
  28. struct NOD *inserare_nod(struct NOD *prim, int x)
  29. {
  30. struct NOD *nod_nou, *nod_curent, *nod_parinte;
  31. nod_nou=creare_nod(x);
  32. if (prim==NULL)
  33. {
  34. /* arborele este vid */
  35. prim=nod_nou;
  36. printf("A fost adaugat primul nod: %d. \n", prim->x);
  37. return prim;
  38. }
  39. else
  40. {
  41. /* pozitionare in arbore pe parintele nodului nou
  42. */
  43. nod_curent=prim;
  44. while (nod_curent!=NULL)
  45. {
  46. nod_parinte=nod_curent;
  47. if (x<nod_curent->x) /* parcurgere spre stanga
  48. */
  49. nod_curent=nod_curent->NOD_stanga;
  50. else /* parcurgere spre dreapt
  51. a */
  52. nod_curent=nod_curent->NOD_dreapta;
  53. }
  54. /* creare legatura nod parinte cu nodul nou */
  55. if (x<nod_parinte->x)
  56. {
  57. /* se insereaza la stanga nodului parinte */
  58. nod_parinte->NOD_stanga=nod_nou;
  59. printf("Nodul %d a fost inserat la stanga nodului %d. \n", x, nod_parinte->x);
  60. }
  61. else
  62. {
  63. /* se insereaza la dreapta nodului parinte */
  64. nod_parinte->NOD_dreapta=nod_nou;
  65. printf("Nodul %d a fost inserat la dreapta nodului %d.\n", x, nod_parinte->x);
  66. }
  67. return prim;
  68. }
  69. }
  70. /* parcurgere arbore in preordine */
  71. void afisare_preordine(struct NOD *prim)
  72. {
  73. if (prim!=NULL)
  74. {
  75. /* parcurgere radacina, stanga, dreapta */
  76. printf("%d \n", prim->x);
  77. afisare_preordine(prim->NOD_stanga);
  78. afisare_preordine(prim->NOD_dreapta);
  79. }
  80. }
  81. /* parcurgere arbore in inordine */
  82. void afisare_inordine(struct NOD *prim)
  83. {
  84. if (prim!=NULL)
  85. {
  86. /* parcurgere stanga, radacina, dreapta */
  87. afisare_inordine(prim->NOD_stanga);
  88. printf("%d \n", prim->x);
  89. afisare_inordine(prim->NOD_dreapta);
  90. }
  91. }
  92. /* parcurgere arbore in postordine */
  93. void afisare_postordine(struct NOD *prim)
  94. {
  95. if (prim!=NULL)
  96. {
  97. /* parcurgere stanga, dreapta, radacina */
  98. afisare_postordine(prim->NOD_stanga);
  99. afisare_postordine(prim->NOD_dreapta);
  100. printf("%d \n", prim->x);
  101. }
  102. }
  103.  
  104. /* stergerea unui arbore sau subarbore */
  105. struct NOD *stergere_arbore(struct NOD *tmp)
  106. {
  107. if (tmp!=NULL)
  108. {
  109. stergere_arbore(tmp->NOD_stanga);
  110. stergere_arbore(tmp->NOD_dreapta);
  111. free(tmp);
  112. }
  113. return NULL;
  114. }
  115. /* cautarea unui nod dorit */
  116. struct NOD *cauta_nod(struct NOD *tmp, int x)
  117. {
  118. if (tmp!=NULL)
  119. {
  120. if (x==tmp->x)
  121. {
  122. printf("Nodul a fost gasit. \n");
  123. return tmp;
  124. }
  125. else if (x<tmp->x)
  126. return cauta_nod(tmp->NOD_stanga, x);
  127. else
  128. return cauta_nod(tmp->NOD_dreapta, x);
  129. }
  130. else
  131. {
  132. printf("Nodul dorit nu exista in arbore.\n");
  133. return NULL;
  134. }
  135. }
  136. int Numarfrunze(struct NOD *prim){
  137.  
  138. if (prim ==NULL ) return 0;
  139. else if (prim->NOD_dreapta==NULL && prim->NOD_stanga==NULL) return 1;
  140. else return Numarfrunze(prim->NOD_dreapta)+Numarfrunze(prim->NOD_stanga);
  141. }
  142. int NumarNivele(struct NOD *prim){
  143. if (prim == NULL) return 0;
  144. else{
  145. int adancimestanga = NumarNivele(prim->NOD_stanga);
  146. int adancimedreapta = NumarNivele(prim->NOD_dreapta);
  147. if(adancimestanga > adancimedreapta) return (adancimestanga+1);
  148. else return (adancimedreapta+1);
  149. }
  150. }
  151. int main()
  152. {
  153. struct NOD *prim=NULL, *nod_gasit;
  154. char operatie;
  155. int x; int nr=0;
  156. printf("MENIU: \n");
  157. printf("[1] Inserare nod in arbore \n");
  158. printf("[2] Afisare arbore preordine \n");
  159. printf("[3] Afisare arbore inordine \n");
  160. printf("[4] Afisare arbore postordine \n");
  161. printf("[5] Stergere arbore \n");
  162. printf("[6] Cautare nod in arbore \n");
  163. printf("[0] Iesire din program \n");
  164. printf("[8] Stergere de la radacina \n");
  165. printf("[9] Numarul de frunze din arbore \n");
  166. printf("[N] Numarul de nivele din arbore \n");
  167.  
  168. do
  169. {
  170. printf("\nIntroduceti operatie: ");
  171. operatie=getche();
  172. printf("\n");
  173. switch (operatie)
  174. {
  175. case '1':
  176. printf("#Inserare nod in arbore# \n");
  177. printf("Introduceti valoarea nodului care va fi inserat: ");
  178. scanf("%d", &x);
  179. prim=inserare_nod(prim, x);
  180. break;
  181. case '2':
  182. printf("#Afisare arbore preordine# \n");
  183. if (prim==NULL)
  184. printf("Atentie: Arborele este gol.");
  185. else
  186. afisare_preordine(prim);
  187. break;
  188. case '3':
  189. printf("#Afisare arbore inordine# \n");
  190. if (prim==NULL)
  191. printf("Atentie: Arborele este gol.");
  192. else
  193. afisare_inordine(prim);
  194. break;
  195. case '4':
  196. printf("Afisare arbore postordine: \n");
  197. if (prim==NULL)
  198. printf("Atentie: Arborele este gol.");
  199. else
  200. afisare_postordine(prim);
  201. break;
  202. case '5':
  203. printf("#Stergere arbore# \n");
  204. if (prim==NULL)
  205. printf("Atentie: Arborele este gol.");
  206. else
  207. {
  208. printf("Introduceti valoarea nodul al carui arbore va fi sters: ");
  209. scanf("%d", &x);
  210. nod_gasit=cauta_nod(prim, x);
  211. if (nod_gasit!=NULL)
  212. {
  213. nod_gasit->NOD_stanga=
  214. stergere_arbore(nod_gasit->NOD_stanga);
  215.  
  216. nod_gasit->NOD_dreapta=
  217. stergere_arbore(nod_gasit->NOD_dreapta);
  218. printf("Arborele a fost sters. \n");
  219. }
  220. }
  221. break;
  222. case '6':
  223. printf("#Cautare nod in arbore# \n");
  224. if (prim==NULL)
  225. printf("Atentie: Arborele este gol.");
  226. else
  227. {
  228. printf("Introduceti valoarea nodului: ");
  229. scanf("%d", &x);
  230. cauta_nod(prim, x);
  231. }
  232. break;
  233. case '8':
  234. prim = stergere_arbore(prim);
  235. break;
  236. case '9':
  237. printf("Numarul frunzelor este %d", Numarfrunze(prim));
  238. break;
  239. case 'N':
  240. printf("Numarul nivelelor este %d", NumarNivele(prim));
  241. break;
  242. case '0':
  243. printf("Iesire din program \n");
  244. stergere_arbore(prim);
  245. system("PAUSE");
  246. return 0;
  247. break;
  248. default:
  249. printf("Operatie invalida \n");
  250. }
  251. } while(1);
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement