sconetto

EDA - Árvore Binária

May 24th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.84 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct No {
  5.   int numero;
  6.   struct No *esquerda;
  7.   struct No *direita;
  8. };
  9. typedef struct No No;
  10.  
  11. void criarArvore(No **pRaiz) {
  12.   *pRaiz = NULL;
  13. }
  14.  
  15. void inserir(No **pRaiz, int numero) {
  16.   if(*pRaiz == NULL) {
  17.     *pRaiz = (No *) malloc(sizeof(No));
  18.     (*pRaiz)->esquerda = NULL;
  19.     (*pRaiz)->direita = NULL;
  20.     (*pRaiz)->numero = numero;
  21.   }else{
  22.     if(numero < (*pRaiz)->numero)
  23.       inserir(&(*pRaiz)->esquerda, numero);
  24.     if(numero > (*pRaiz)->numero)
  25.       inserir(&(*pRaiz)->direita, numero);
  26.   }
  27. }
  28.  
  29. No *MaiorDireita(No **no){
  30.     if((*no)->direita != NULL)
  31.        return MaiorDireita(&(*no)->direita);
  32.     else{
  33.        No *aux = *no;
  34.        if((*no)->esquerda != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da esquerda!
  35.           *no = (*no)->esquerda;
  36.        else
  37.           *no = NULL;
  38.        return aux;
  39.        }
  40. }
  41.  
  42. No *MenorEsquerda(No **no){
  43.     if((*no)->esquerda != NULL)
  44.        return MenorEsquerda(&(*no)->esquerda);
  45.     else{
  46.        No *aux = *no;
  47.        if((*no)->direita != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da direita!
  48.           *no = (*no)->direita;
  49.        else
  50.           *no = NULL;
  51.        return aux;
  52.        }
  53. }
  54.  
  55. void remover(No **pRaiz, int numero){
  56.     if(*pRaiz == NULL){   // esta verificacao serve para caso o numero nao exista na arvore.
  57.        printf("Numero nao existe na arvore!");
  58.        return;
  59.     }
  60.     if(numero < (*pRaiz)->numero)
  61.        remover(&(*pRaiz)->esquerda, numero);
  62.     else
  63.        if(numero > (*pRaiz)->numero)
  64.           remover(&(*pRaiz)->direita, numero);
  65.        else{    // se nao eh menor nem maior, logo, eh o numero que estou procurando! :)
  66.           No *pAux = *pRaiz;     // quem programar no Embarcadero vai ter que declarar o pAux no inicio do void! :[
  67.           if (((*pRaiz)->esquerda == NULL) && ((*pRaiz)->direita == NULL)){         // se nao houver filhos...
  68.                 free(pAux);
  69.                 (*pRaiz) = NULL;
  70.                }
  71.           else{     // so tem o filho da direita
  72.              if ((*pRaiz)->esquerda == NULL){
  73.                 (*pRaiz) = (*pRaiz)->direita;
  74.                 pAux->direita = NULL;
  75.                 free(pAux); pAux = NULL;
  76.                 }
  77.              else{            //so tem filho da esquerda
  78.                 if ((*pRaiz)->direita == NULL){
  79.                     (*pRaiz) = (*pRaiz)->esquerda;
  80.                     pAux->esquerda = NULL;
  81.                     free(pAux); pAux = NULL;
  82.                     }
  83.                 else{       //Escolhi fazer o maior filho direito da subarvore esquerda.
  84.                    pAux = MaiorDireita(&(*pRaiz)->esquerda); //se vc quiser usar o Menor da esquerda, so o que mudaria seria isso:
  85.                    pAux->esquerda = (*pRaiz)->esquerda;          //        pAux = MenorEsquerda(&(*pRaiz)->direita);
  86.                    pAux->direita = (*pRaiz)->direita;
  87.                    (*pRaiz)->esquerda = (*pRaiz)->direita = NULL;
  88.                    free((*pRaiz));  *pRaiz = pAux;  pAux = NULL;
  89.                    }
  90.                 }
  91.              }
  92.           }
  93. }
  94.  
  95. void exibirEmOrdem(No *pRaiz){
  96.     if(pRaiz != NULL){
  97.         exibirEmOrdem(pRaiz->esquerda);
  98.         printf("\n%i", pRaiz->numero);
  99.         exibirEmOrdem(pRaiz->direita);
  100.     }
  101. }
  102.  
  103. void exibirPreOrdem(No *pRaiz){
  104.     if(pRaiz != NULL){
  105.         printf("\n%i", pRaiz->numero);
  106.         exibirPreOrdem(pRaiz->esquerda);
  107.         exibirPreOrdem(pRaiz->direita);
  108.     }
  109. }
  110.  
  111. void exibirPosOrdem(No *pRaiz){
  112.     if(pRaiz != NULL){
  113.         exibirPosOrdem(pRaiz->esquerda);
  114.         exibirPosOrdem(pRaiz->direita);
  115.         printf("\n%i", pRaiz->numero);
  116.     }
  117. }
  118.  
  119. int contarNos(No *pRaiz){
  120.    if(pRaiz == NULL)
  121.         return 0;
  122.    else
  123.         return 1 + contarNos(pRaiz->esquerda) + contarNos(pRaiz->direita);
  124. }
  125.  
  126. int contarFolhas(No *pRaiz){
  127.    if(pRaiz == NULL)
  128.         return 0;
  129.    if(pRaiz->esquerda == NULL && pRaiz->direita == NULL)
  130.         return 1;
  131.    return contarFolhas(pRaiz->esquerda) + contarFolhas(pRaiz->direita);
  132. }
  133.  
  134. int maior(int a, int b){
  135.     if(a > b)
  136.         return a;
  137.     else
  138.         return b;
  139. }
  140.  
  141. int altura(No *pRaiz){
  142.    if((pRaiz == NULL) || (pRaiz->esquerda == NULL && pRaiz->direita == NULL))
  143.        return 0;
  144.    else
  145.        return 1 + maior(altura(pRaiz->esquerda), altura(pRaiz->direita));
  146. }
  147.  
  148. int main(int argc, char const *argv[]) {
  149.   No **arvore;
  150.   criarArvore(arvore);
  151.   inserir(arvore, 7);
  152.   inserir(arvore, 10);
  153.   inserir(arvore, 3);
  154.   inserir(arvore, 6);
  155.   inserir(arvore, 1);
  156.   inserir(arvore, 20);
  157.   inserir(arvore, 30);
  158.   inserir(arvore, 40);
  159.   inserir(arvore, 50);
  160.   inserir(arvore, 60);
  161.   exibirEmOrdem(*arvore);
  162.   printf("\n\n");
  163.   exibirPosOrdem(*arvore);
  164.   printf("\n\n");
  165.   exibirPreOrdem(*arvore);
  166.   printf("\n\n");
  167.   return 0;
  168. }
Add Comment
Please, Sign In to add comment