Guest User

Untitled

a guest
Jul 16th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.91 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. int contaNosNivel(int niv, Arvore *raiz){
  11. int numero;
  12. if(!raiz) return 0;
  13. if(raiz == 0) return 1;
  14. //este clobo que segue é dispensavel só faz uma chamada recursiva a menos
  15. if(niv==1){
  16. int numero=0;// inicia em 0, pois pode nao entrar no 1 if
  17. if(raiz->esq) numero=1;
  18. if(raiz->dir)numero - numero + 1;
  19. return numero;
  20. }
  21. return contaNosNivel(niv -1, raiz->esq)+ contaNosNivel (niv -1, raiz->dir);
  22. }
  23.  
  24. Arvore *achaMenor(Arvore *raiz){
  25. Arvore *menor, *menorSubArv;
  26.  
  27. if(raiz){ // if(raiz!=NULL)
  28. menor=raiz;
  29. if(raiz->esq){
  30. menorSubArv = achaMenor(raiz->esq);
  31. if(menorSubArv && menorSubArv->conteudo < menor->conteudo)
  32. menor=menorSubArv;
  33. }
  34. if(raiz->dir){
  35. menorSubArv = achaMenor(raiz->dir);
  36. if(menorSubArv && menorSubArv->conteudo < menor->conteudo)
  37. menor = menorSubArv;
  38. }
  39. return menor;
  40. }
  41. return NULL;
  42. }
  43.  
  44.  
  45.  
  46. int contaNos(Arvore *raiz){
  47. //return (!raiz)? 0 : 1 + contaNos (raiz->esq) + contaNos (raiz->dir);
  48. if(!raiz)
  49. return 0;
  50. else return 1 + contaNos (raiz->esq) + contaNos (raiz->dir);
  51. }
  52.  
  53. void emOrdem(Arvore *raiz) {
  54. if (!raiz) return; //como eh procedimento, soh retorna o controle para o main()
  55.  
  56. emOrdem(raiz->esq);
  57. printf("%d ", raiz->conteudo);
  58. emOrdem(raiz->dir);
  59. }
  60.  
  61. Arvore *pesquisaArvore(Arvore *raiz, int conteudoPesquisa) {
  62. if (!raiz) return raiz; //arvore vazia
  63.  
  64. while (raiz->conteudo != conteudoPesquisa) {
  65. if (conteudoPesquisa < raiz->conteudo) raiz = raiz->esq;
  66. else raiz = raiz->dir;
  67.  
  68. if (!raiz) break;
  69. }
  70. return raiz;
  71. }
  72.  
  73. void imprimeArvore(Arvore *raiz, int l) {
  74. int i;
  75.  
  76. if (!raiz) return; //como eh procedimento, soh retorna o controle para o main()
  77.  
  78. imprimeArvore(raiz->dir, l + 1);
  79.  
  80. for (i = 0; i < l; ++i) printf(" ");
  81.  
  82. printf("%d\n", raiz->conteudo);
  83. imprimeArvore(raiz->esq, l + 1);
  84. }
  85.  
  86. Arvore *insereNaArvoreBinaria(Arvore *raiz, Arvore *r, int conteudo) {
  87. if (!r) {
  88. r = (Arvore *)malloc(sizeof(Arvore));
  89. if (!r) {
  90. printf("\n\nSEM MEMORIA!! Programa finalizado!\n");
  91. exit(0);
  92. }
  93. r->esq = NULL;
  94. r->dir = NULL;
  95. r->conteudo = conteudo;
  96.  
  97. if (!raiz) {
  98. printf("\nna primeira insercao\n");
  99. return r; //primeira entrada
  100. }
  101. if (conteudo == raiz->conteudo)
  102. printf("\nnumero jah cadastrado\n");
  103. else if (conteudo < raiz->conteudo) raiz->esq = r;
  104. else raiz->dir = r;
  105.  
  106. return r;
  107. }
  108. if (conteudo < r->conteudo) {
  109. printf("\nfui pra esquerda\n");
  110. insereNaArvoreBinaria(r, r->esq, conteudo);
  111. }
  112. else {
  113. printf("\nfui pra direita\n");
  114. insereNaArvoreBinaria(r, r->dir, conteudo);
  115. }
  116. }
  117.  
  118. Arvore *deletaArvore(Arvore *raiz, int conteudo) {
  119. Arvore *p, *p2;
  120.  
  121. if (!raiz) return raiz; //arvore vazia, logo conteudo nao encontrado
  122.  
  123. if (raiz->conteudo == conteudo) { //apagar a raiz
  124. //isso significa uma arvore vazia
  125. if (raiz->esq == raiz->dir) {
  126. free(raiz);
  127. return NULL;
  128. } else if (raiz->esq == NULL) { //ou se uma subarvore eh nula
  129. p = raiz->dir;
  130. free(raiz);
  131. return p;
  132. } else if (raiz->dir == NULL) {
  133. p = raiz->esq;
  134. free(raiz);
  135. return p;
  136. } else { //ou as duas subarvores estao presentes
  137. p2 = raiz->dir;
  138. p = raiz->dir;
  139. while (p->esq)
  140. p = p->esq;
  141. p->esq = raiz->esq;
  142. free(raiz);
  143. return p2;
  144. }
  145. }
  146. if (raiz->conteudo < conteudo) raiz->dir = deletaArvore(raiz->dir, conteudo);
  147. else raiz->esq = deletaArvore(raiz->esq, conteudo);
  148.  
  149. return raiz;
  150. }
  151.  
  152. int main() {
  153. Arvore *arvore, *menor;
  154. char op;
  155. int conteudo, cont, nivel, num;
  156.  
  157. //recebe do usuario a quantidade de elementos a serem inserido na arvore
  158. arvore = NULL;
  159. do {
  160. system("cls");
  161. printf("Menu de opcoes para arvore binaria sobre vetores\n");
  162. printf(" \n1 - Inserir \n2 - Pesquisar \n3 - Mostrar \n4 - Remover \n5 - Conta Nos \n6 - Acha menor \n7 - Conta Niveis da arvore \n\n8 - Sair \n\nEscolha uma opcao:");
  163. op = getchar();
  164. fflush(stdin);//fflush(stdin);
  165.  
  166. switch (op) {
  167. case '1' : printf("\nInserindo na arvore ...\n");
  168. printf("\nDigite um numero: ");
  169. scanf("%d", &conteudo);
  170. fflush(stdin);//fflush(stdin);
  171. if (!arvore)
  172. arvore = insereNaArvoreBinaria(arvore, arvore, conteudo);
  173. else insereNaArvoreBinaria(arvore, arvore, conteudo);
  174. getchar();
  175. break;
  176. case '2' : printf("\nPesquisando na arvore ...\n");
  177. if (!arvore) printf("Arvore vazia!!\n");
  178. else {
  179. printf("\nDigite um numero: ");
  180. scanf("%d", &conteudo);
  181. fflush(stdin);//fflush(stdin);
  182. if (pesquisaArvore(arvore, conteudo)) printf("Valor localizado na arvore\n");
  183. else printf("\nValor NAO localizado na arvore!!\n");
  184. }
  185. getchar();
  186. case '3' : printf("\nMostrando a arvore ...\n");
  187. if (arvore) imprimeArvore(arvore, 0);
  188. else printf("Arvore vazia!!\n");
  189. getchar();
  190. break;
  191. case '4' : printf("\nRemovendo elemento da arvore ...\n");
  192. if (!arvore) printf("Arvore vazia!!\n");
  193. else {
  194. printf("Digite um numero: ");
  195. scanf("%d", &conteudo);
  196. fflush(stdin);//fflush(stdin);
  197. if (deletaArvore(arvore, conteudo)) printf("Valor localizado na arvore\n");
  198. else printf("Valor NAO localizado na arvore!!\n");
  199. }
  200. getchar();
  201. break;
  202. case '5' : printf("\nContando os nos...\n");
  203. cont = contaNos(arvore);
  204. if(cont==0)
  205. printf("\nArvore vazia!!!");
  206. else printf("Numero de nos: %d", cont);
  207. getchar();
  208. break;
  209. case '6' : printf("\nProcurando Menor NO...\n");
  210. menor = achaMenor(arvore);
  211. if(menor)
  212. printf("\nMenor NO = %d", menor->conteudo);
  213. else printf("\nArvore vazia!!!");
  214. getchar();
  215. break;
  216. case '7' : printf("\nContando os Niveis da arvore...");
  217. printf("\nInforme a árvore:");
  218. scanf("%d", &nivel);
  219. num = contaNosNivel(nivel, arvore);
  220. if(num)
  221. printf("\nNumero de niveis da arvore %d = %d", nivel, num);
  222. else printf("\nArvore %d vazia!!!", nivel);
  223. getchar();
  224. break;
  225. case '8' : break;
  226. default : printf("\nOpcao invalida!\n\n");
  227. getchar();
  228. }
  229.  
  230. } while(op != '8');
  231.  
  232. return 1;
  233. }
Add Comment
Please, Sign In to add comment