Advertisement
bernardolansing

Árvore binária de busca com problemas de execução via CMD

Oct 30th, 2021
347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.02 KB | None | 0 0
  1. // Online C compiler to run C program online
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. #define true 1
  6.  
  7. typedef struct strct_node node;
  8. typedef node tree;
  9.  
  10. struct strct_node {
  11. int info;
  12. node *dir;
  13. node *esq;
  14. };
  15.  
  16. struct caminho {
  17. int tamanho;
  18. node **lista;
  19. };
  20.  
  21. // inicializa uma árvore de modo que fique evidente que esta árvore está vazia.
  22. void inicializar(tree **arv) {
  23. *arv = malloc(sizeof (tree));
  24. (*arv)->dir = (node *) -1;
  25. (*arv)->esq = (node *) -1;
  26. }
  27.  
  28. node *criar_nodo(int conteudo) {
  29. node *nodo = malloc(sizeof (nodo));
  30. nodo->esq = NULL;
  31. nodo->dir = NULL;
  32. nodo->info = conteudo;
  33. }
  34.  
  35. struct caminho caminhar(tree *arv) {
  36. static int layer = 0;
  37. static int qnt_nodos = 0;
  38. static node **vetor = NULL;
  39. node *walker = arv;
  40.  
  41. if (vetor == NULL || !layer)
  42. vetor = malloc(1);
  43.  
  44. // RECURSÃO -----------------------------------------------------
  45. layer++;
  46.  
  47. if (walker->esq != NULL) {
  48. caminhar(walker->esq);
  49. }
  50.  
  51. qnt_nodos++;
  52. vetor = realloc(vetor, qnt_nodos * (sizeof (node *)));
  53. vetor[qnt_nodos - 1] = walker;
  54.  
  55. if (walker->dir != NULL) {
  56. caminhar(walker->dir);
  57. }
  58.  
  59. layer--;
  60. // --------------------------------------------------------------
  61.  
  62. if (!layer) {
  63. struct caminho retorno;
  64. retorno.tamanho = qnt_nodos;
  65. retorno.lista = vetor;
  66. qnt_nodos = 0;
  67.  
  68. return retorno;
  69. }
  70. }
  71.  
  72. void imprimir(tree *arvore) {
  73.  
  74. struct caminho trilha = caminhar(arvore);
  75.  
  76. printf("%i", trilha.lista[0]->info);
  77.  
  78. for (int i = 1; i < trilha.tamanho; i++)
  79. printf(" - %i", trilha.lista[i]->info);
  80.  
  81. puts("");
  82. }
  83.  
  84. void inserir(int valor, tree *arv) {
  85.  
  86. // árvore vazia
  87. if (arv->dir == (node *) -1 && arv->esq == (node *) -1) {
  88. arv->info = valor;
  89. arv->esq = NULL;
  90. arv->dir = NULL;
  91. return;
  92. }
  93.  
  94. node *walker = arv;
  95.  
  96. while (true) {
  97.  
  98. if (walker->info > valor) {
  99.  
  100. if (walker->esq == NULL) {
  101. walker->esq = criar_nodo(valor);
  102. return;
  103. }
  104.  
  105. walker = walker->esq;
  106. }
  107.  
  108. if (walker->info <= valor) {
  109.  
  110. if (walker->dir == NULL) {
  111. walker->dir = criar_nodo(valor);
  112. return;
  113. }
  114.  
  115. walker = walker->dir;
  116. }
  117. }
  118. }
  119.  
  120. int comparar_arvores(tree *arv1, tree *arv2) {
  121. struct caminho trilha1 = caminhar(arv1);
  122. struct caminho trilha2 = caminhar(arv2);
  123. int teste1, teste2;
  124.  
  125. if (trilha1.tamanho != trilha2.tamanho)
  126. return 0;
  127.  
  128. for (int i = 0; i < trilha1.tamanho; i++) {
  129.  
  130. teste1 = trilha1.lista[i]->info;
  131. teste2 = trilha2.lista[i]->info;
  132.  
  133. if (trilha1.lista[i]->info != trilha2.lista[i]->info)
  134. return 0;
  135. }
  136.  
  137. return 1;
  138. }
  139.  
  140. // verifica se a árvore segue, de fato, a estrutura de uma árvore binária.
  141. int check_arvore_crescente(tree *arv) {
  142. struct caminho trilha = caminhar(arv);
  143.  
  144. for (int i = 1; i < trilha.tamanho; i++) {
  145. if (trilha.lista[i - 1]->info > trilha.lista[i]->info)
  146. return 0;
  147. }
  148.  
  149. return 1;
  150. }
  151.  
  152. void imprimir_arvore_por_altura(tree *arv) {
  153. static int layer = 0;
  154. node *walker = arv;
  155.  
  156. // árvore vazia
  157. if (walker == NULL || (arv->dir == (node *) -1 && arv->esq == (node *) -1))
  158. puts("Árvore vazia, nada a exibir.");
  159.  
  160. if (!layer)
  161. printf("Nodos e seus níveis: ");
  162.  
  163. // RECURSÃO -----------------------------------------------------
  164. layer++;
  165.  
  166. if (walker->esq != NULL)
  167. imprimir_arvore_por_altura(walker->esq);
  168.  
  169. printf("\t%i (niv: %i)", walker->info, layer);
  170.  
  171. if (walker->dir != NULL)
  172. imprimir_arvore_por_altura(walker->dir);
  173.  
  174. layer--;
  175. // --------------------------------------------------------------
  176.  
  177. if (!layer)
  178. puts("");
  179. }
  180.  
  181. node *encontrar_nodo(int valor, tree *arv) {
  182. node *walker = arv;
  183.  
  184. // árvore vazia
  185. if (walker == NULL || (arv->dir == (node *) -1 && arv->esq == (node *) -1))
  186. return NULL;
  187.  
  188. // BUSCA
  189.  
  190. while (true) {
  191.  
  192. if (walker->info > valor) {
  193.  
  194. if (walker->esq == NULL)
  195. return NULL;
  196.  
  197. walker = walker->esq;
  198. }
  199.  
  200. else if (walker->info < valor) {
  201.  
  202. if (walker->dir == NULL)
  203. return NULL;
  204.  
  205. walker = walker->dir;
  206. }
  207.  
  208. else
  209. return walker;
  210. }
  211. }
  212.  
  213. void obter_caminho(tree *arv, int v1, int v2) {
  214. struct caminho trilha = caminhar(arv);
  215. int *percurso = malloc(1);
  216. int compr = 0;
  217. node *tracker = encontrar_nodo(v1, arv);
  218.  
  219. while (true) {
  220.  
  221. if (tracker->info > v2) {
  222.  
  223. if (tracker->esq == NULL) {
  224. puts("Não há caminho entre estes dois valores.");
  225. return;
  226. }
  227.  
  228. compr++;
  229. percurso = realloc(percurso, compr * sizeof (int));
  230. percurso[compr - 1] = tracker->info;
  231. tracker = tracker->esq;
  232. }
  233.  
  234. if (tracker->info < v2) {
  235.  
  236. if (tracker->dir == NULL) {
  237. puts("Não há caminho entre estes dois valores.");
  238. return;
  239. }
  240.  
  241. compr++;
  242. percurso = realloc(percurso, compr * sizeof (int));
  243. percurso[compr - 1] = tracker->info;
  244. tracker = tracker->dir;
  245. }
  246.  
  247. if (tracker->info == v2) {
  248.  
  249. printf("Caminho de %i para %i:\n", v1, v2);
  250.  
  251. for (int i = 0; i < compr; i++)
  252. printf("%i -> ", percurso[i]);
  253.  
  254. printf("%i", v2);
  255.  
  256. return;
  257. }
  258. }
  259. }
  260.  
  261. int main() {
  262. tree *arvore;
  263. inicializar(&arvore);
  264.  
  265. inserir(5, arvore);
  266. inserir(11, arvore);
  267. inserir(3, arvore);
  268. inserir(2, arvore);
  269. inserir(13, arvore);
  270. inserir(7, arvore);
  271. inserir(12, arvore);
  272. inserir(14, arvore);
  273. inserir(23, arvore);
  274. inserir(6, arvore);
  275.  
  276.  
  277. imprimir(arvore);
  278.  
  279. tree *arvore2;
  280. inicializar(&arvore2);
  281.  
  282. inserir(5, arvore2);
  283. inserir(12, arvore2);
  284. inserir(3, arvore2);
  285. inserir(2, arvore2);
  286. inserir(13, arvore2);
  287. inserir(7, arvore2);
  288.  
  289. tree *arvore3;
  290. inicializar(&arvore3);
  291.  
  292. inserir(5, arvore3);
  293. inserir(12, arvore3);
  294. inserir(3, arvore3);
  295. inserir(2, arvore3);
  296. inserir(13, arvore3);
  297. inserir(7, arvore3);
  298.  
  299.  
  300. imprimir(arvore2);
  301. imprimir(arvore3);
  302.  
  303. if (comparar_arvores(arvore, arvore2)) puts("iguais");
  304. else puts("diferentes");
  305.  
  306. if (comparar_arvores(arvore3, arvore2)) puts("iguais");
  307. else puts("diferentes");
  308.  
  309. if (check_arvore_crescente(arvore)) puts("Funcionou");
  310. else puts("Não funcionou");
  311.  
  312. node *busca = encontrar_nodo(7, arvore);
  313. printf("busca = %i\n", busca->info);
  314.  
  315. getchar();
  316. return 0;
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement