Guest User

Untitled

a guest
Jul 17th, 2018
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.25 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct no {
  5. int conteudo;
  6. struct no *esq,
  7. *dir;
  8. } Arvore;
  9.  
  10.  
  11.  
  12. /*################################################################################
  13. Função que remove da árvore binária os múltiplos do valor informado pelo usuário
  14. ################################################################################*/
  15.  
  16. Arvore *deletaArvore(Arvore *raiz, int conteudo) {
  17. Arvore *p, *p2;
  18.  
  19. if (!raiz) return raiz; //arvore vazia, logo conteudo nao encontrado
  20.  
  21. if (raiz->conteudo == conteudo) { //apagar a raiz
  22. //isso significa uma arvore vazia
  23. if (raiz->esq == raiz->dir) {
  24. free(raiz);
  25. return NULL;
  26. } else if (raiz->esq == NULL) { //ou se uma subarvore é nula
  27. p = raiz->dir;
  28. free(raiz);
  29. return p;
  30. } else if (raiz->dir == NULL) {
  31. p = raiz->esq;
  32. free(raiz);
  33. return p;
  34. }
  35. else { //ou as duas subarvores estao presentes
  36. p2 = raiz->dir;
  37. p = raiz->dir;
  38. while (p->esq)
  39. p = p->esq;
  40. p->esq = raiz->esq;
  41. free(raiz);
  42. return p2;
  43. }
  44. }
  45. if (raiz->conteudo < conteudo)
  46. raiz->dir = deletaArvore(raiz->dir, conteudo);
  47. else
  48. raiz->esq = deletaArvore(raiz->esq, conteudo);
  49.  
  50.  
  51. return raiz;
  52. }
  53.  
  54. /*###############################################################################
  55. #######Função que percorre a árvore e verifica se o valor é múltiplo###########
  56. ##############################################################################*/
  57.  
  58. Arvore *deletaMultiplo(Arvore *raiz, Arvore *r, int conteudo, int nivel) {
  59.  
  60. if (!raiz)
  61. return r;
  62.  
  63. deletaMultiplo(raiz->dir, r, conteudo, nivel + 1);
  64. if(raiz->conteudo%conteudo==0);
  65. r = deletaArvore(r, nivel);
  66. deletaMultiplo(raiz->esq, r, conteudo, nivel + 1);
  67.  
  68. }
  69.  
  70. /*###############################################################################
  71. #########################Função que exibe a árvore binária#####################
  72. ##############################################################################*/
  73.  
  74. void imprimeArvore(Arvore *raiz, int nivel) {
  75. int i;
  76.  
  77. if (!raiz) return; //como eh procedimento, soh retorna o controle para o main()
  78. imprimeArvore(raiz->dir, nivel + 1);
  79. for (i = 0; i < nivel; ++i)
  80. printf(" ");
  81. printf("%d\n", raiz->conteudo);
  82. imprimeArvore(raiz->esq, nivel + 1);
  83. }
  84.  
  85. /*###############################################################################
  86. #######################Função de inserção na árvore binária####################
  87. ##############################################################################*/
  88.  
  89. Arvore *insereNaArvoreBinaria(Arvore *raiz, Arvore *r, int conteudo) {
  90. if (!r) { //se r for NULO
  91. r = (Arvore *)malloc(sizeof(Arvore)); //alocação de memoria
  92. if (!r) { // se ao alocar não existir memoria, o programa é finalizado
  93. printf("\n\nSEM MEMORIA!! Programa finalizado!\n");
  94. exit(0);
  95. }
  96. r->esq = NULL;
  97. r->dir = NULL;
  98. r->conteudo = conteudo;
  99.  
  100. if (!raiz) {
  101. printf("\nPrimeira inserção...Raiz principal!!\n");
  102. return r; //retorna a primeira inserção
  103. }
  104. if (conteudo == raiz->conteudo) {//verificando se o valor já existe na árvore
  105. printf("\nValor já existente na árvore\n");
  106. return ;//retorna para o menu
  107. }
  108. else if (conteudo < raiz->conteudo)
  109. raiz->esq = r;
  110. else raiz->dir = r;
  111.  
  112. return r;
  113. }
  114. if (conteudo == r->conteudo){//verificando se o valor já existe na árvore
  115. printf("\nValor já existente na árvore\n");
  116. return ;
  117. }
  118. //se valor a ser inserido for menor que a raiz, valor é inserido à esquerda
  119. else if (conteudo < r->conteudo) {
  120. printf("\nDescendo para esquerda\n");
  121. insereNaArvoreBinaria(r, r->esq, conteudo);//chama a recurção lado esquerdo
  122. }
  123. //se valor a ser inserido for maior que a raiz, valor é inserido à direita
  124. else {
  125. printf("\nDescendo para direita\n");
  126. insereNaArvoreBinaria(r, r->dir, conteudo);//chama a recurção lado direito
  127. }
  128. }
  129.  
  130. int main() {
  131. Arvore *arvore;
  132. char op;
  133. int conteudo, i, qtdNos;
  134.  
  135. srand(time(NULL));
  136.  
  137. //recebe do usuario a quantidade de elementos a serem inserido na arvore
  138. arvore = NULL;
  139.  
  140. do {
  141. system("cls");
  142. printf("Menu de opcoes para arvore binaria de pesquisa BALANCEADA (AVL)\n\n\n");
  143. printf("1 - Gera arvore aleatoriamente\n");
  144. printf("2 - Exibir arvore\n");
  145. printf("3 - Remove elemento da arvore\n");
  146. printf("4 - Sair\n\n\n");
  147. printf("Opcao: ");
  148. op = getchar();
  149. fflush(stdin);
  150.  
  151. switch (op) {
  152. case '1' : printf("Gerando arvore aleatoriamente ...\n");
  153. printf("Digite a quantidade de nos para a arvore: ");
  154. scanf("%d", &qtdNos);
  155. fflush(stdin);
  156. //laço que gera números randomicamente à serem inseridos na árvore
  157. for (i = 1; i <= qtdNos; i++) {
  158. conteudo = rand() % 100;
  159. if (!arvore)//se arvore for igual a NULL
  160. arvore = insereNaArvoreBinaria(arvore, arvore, conteudo);
  161. else insereNaArvoreBinaria(arvore, arvore, conteudo);
  162. }
  163. printf("\nARVORE GERADA COM SUCESSO!!\n");
  164. getchar();
  165. break;
  166. case '2' : printf("Mostrando a arvore ...\n");
  167. if (arvore)//se arvore for diferente de NULL
  168. imprimeArvore(arvore, 0);
  169. else
  170. printf("Arvore vazia!!\n");// senão árvore está vazia
  171. getchar();
  172. break;
  173. case '3' : printf("Removendo elemento da arvore ...\n");
  174. if (!arvore)
  175. printf("Arvore vazia!!\n");
  176. else
  177. printf("Digite um numero: ");//valora ser removido, informado pelo usuário
  178. scanf("%d", &conteudo);
  179. fflush(stdin);
  180. arvore = deletaMultiplo(arvore, arvore, conteudo, 0);
  181. getchar();
  182. break;
  183. case '4' : break;
  184. default : printf("\nOpcao invalida!\n\n");
  185. getchar();
  186. }
  187. } while (op != '4');
  188.  
  189. return 1;
  190. }
Add Comment
Please, Sign In to add comment