Advertisement
caiooa

estrutura de dados 2 - 18/09/2019

Sep 18th, 2019
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.80 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct node {
  5.    char chave;
  6.    int altura;
  7.    struct node* esq;
  8.    struct node* dir;
  9. } No, Arvore;
  10.  
  11. /*----------------------*/
  12. int maior (int esq, int dir) {
  13.    return (esq > dir ? esq : dir);
  14. }
  15.  
  16. /*----------------------*/
  17. int altura (Arvore* a)
  18. {
  19.     //se não tiver nenhum nó, altura é -1
  20.     //caso contrário, retornar o que estiver no campo altura do nó
  21.    return(a==NULL?-1:a->altura);
  22. }
  23.  
  24. int atualizar_altura (Arvore *a)
  25. {
  26.     //ver qual dos descendentes tem altura maior
  27.     //atribuir ao pai o maior dos filhos +1
  28.     return(maior(altura(a->esq),altura(a->dir))+1);
  29. }
  30.  
  31. /*----------------------*/
  32. int balanceamento (Arvore *a)
  33. {
  34.     return(altura(a->dir)-altura(a->esq));
  35. }
  36.  
  37. /*----------------------*/
  38. Arvore* rotacao_simples_esq (Arvore* a)
  39. {
  40.     //criar um node temporário para armazernar
  41.     //os ponteiros para os antigos
  42.     node *t=a->dir;
  43.     a->dir=t->esq;
  44.     t->esq=a;
  45.     a->altura=atualizar_altura(a);
  46.     t->altura=atualizar_altura(t);
  47.     return t;
  48. }
  49.  
  50. /*----------------------*/
  51. Arvore* rotacao_simples_dir (Arvore* a)
  52. {
  53. //espelho da rotação à esquerda
  54. //trocando apenas os campos direita e esquerda
  55.     node *t=a->esq;
  56.     a->esq=t->dir;
  57.     t->dir=a;
  58.     a->altura=atualizar_altura(a);
  59.     t->altura=atualizar_altura(t);
  60.     return t;
  61. }
  62.  
  63. /*----------------------*/
  64. Arvore* rotacao_dupla_esq (Arvore* a)
  65. {
  66.     //vai utlizar as rotações simples definidas anteriormente
  67.     a->dir=rotacao_simples_dir(a->dir);
  68.     return rotacao_simples_esq(a);
  69. }
  70.  
  71. /*----------------------*/
  72. Arvore* rotacao_dupla_dir (Arvore* a)
  73. {
  74.     //espelho da rotação dupla à esquerda
  75.     //apenas mudando direita por esquerda
  76.     a->dir=rotacao_simples_esq(a->esq);
  77.     return rotacao_simples_dir(a);
  78. }
  79.  
  80. /*----------------------*/
  81. Arvore* atualizar_fb_dir (Arvore *a)
  82. {
  83. //espelho de atualizar_fb_esq
  84. //direita e esquerda das rotações invertidas
  85. //-2 invertido, <= invertido
  86.     if(balanceamento(a)==2)
  87.     {
  88.         if(balanceamento(a->dir)>=0)
  89.             {
  90.             a=rotacao_simples_esq(a);
  91.             }
  92.         else
  93.             {
  94.             a=rotacao_dupla_esq(a);
  95.             }
  96.     }
  97.     return a;
  98. }
  99.  
  100. /*----------------------*/
  101. Arvore* atualizar_fb_esq (Arvore *a)
  102. {
  103.     //se o fator de balanceamento for igual a -2
  104.     //rotacionar para rebalancear
  105.     if(balanceamento(a)==-2)
  106.     {
  107.         if(balanceamento(a->esq)<=0)
  108.             {
  109.             a=rotacao_simples_dir(a);
  110.             }
  111.         else
  112.             {
  113.             a=rotacao_dupla_dir(a);
  114.             }
  115.     }
  116.     return a;
  117. }
  118.  
  119. /*----------------------*/
  120. Arvore* inserir (Arvore *a, char chave)
  121. {
  122.     //se a árvore estiver vazia, criar um nó raiz
  123.     //atribuir nela a chave passada
  124.     //preecher a altura dessa raiz como 0
  125.     //e os filhos como NULL
  126.     if(a==NULL)
  127.     {
  128.         a=(No*)malloc(sizeof(No));
  129.         a->chave=chave;
  130.         a->altura=0;
  131.         a->esq=a->dir=NULL;
  132.     }
  133.     //se já existe uma raiz
  134.     //chamar recursivamente o inserir
  135.     //olhando se deve colocar à esquerda (menor) ou à direita (se for maior)
  136.     else if(chave<a->chave)
  137.     {
  138.         a->esq = inserir(a->esq,chave);
  139.         a=atualizar_fb_esq(a);
  140.     }
  141.     else
  142.     {
  143.         a->dir = inserir(a->dir,chave);
  144.         a=atualizar_fb_dir(a);
  145.     }
  146.     return a;
  147. }
  148.  
  149. /*----------------------*/
  150. Arvore* remover (Arvore *a, char chave) {
  151.    if (a == NULL) {
  152.       return NULL;
  153.    }
  154.    else {
  155.       if (chave < a->chave) {
  156.          a->esq = remover (a->esq, chave);
  157.          a = atualizar_fb_dir (a);
  158.       }
  159.       else if (chave > a->chave) {
  160.          a->dir = remover (a->dir, chave);
  161.          a = atualizar_fb_esq (a);
  162.       }
  163.       else {
  164.          if ((a->esq == NULL) && (a->dir == NULL)) {
  165.             free (a);
  166.             a = NULL;
  167.          }
  168.          else if (a->esq == NULL) {
  169.             No *tmp = a;
  170.             a = a->dir;
  171.             free (tmp);
  172.          }
  173.          else if (a->dir == NULL) {
  174.             No *tmp = a;
  175.             a = a->esq;
  176.             free (tmp);
  177.          }
  178.          else {
  179.             No *tmp = a->esq;
  180.             while (tmp->dir != NULL) {
  181.                tmp = tmp->dir;
  182.             }
  183.             a->chave = tmp->chave;
  184.             tmp->chave = chave;
  185.             a->esq = remover (a->esq, chave);
  186.             a = atualizar_fb_dir (a);
  187.          }
  188.       }
  189.       return a;
  190.    }
  191. }
  192.  
  193. /*----------------------*/
  194. void imprimir_in_order (Arvore* a, int nivel) {
  195.    if (a != NULL) {
  196.       int i;
  197.       for (i = 0; i < nivel; i++) {
  198.          printf("      ");
  199.       }
  200.       printf("Chave: %c (altura: %d, fb: %+d) no nível: %d\n", a->chave, a->altura, balanceamento(a), nivel);
  201.       imprimir_in_order (a->esq, nivel + 1);
  202.       imprimir_in_order (a->dir, nivel + 1);
  203.    }
  204. }
  205.  
  206. /*----------------------*/
  207. int main () {
  208.  
  209.    Arvore *AVL = NULL;
  210.     //ex1: inserir os termos passados
  211.    AVL = inserir (AVL, 'Q');
  212.    AVL = inserir (AVL, 'Z');
  213.    AVL = inserir (AVL, 'B');
  214.    AVL = inserir (AVL, 'Y');
  215.    AVL = inserir (AVL, 'T');
  216.    AVL = inserir (AVL, 'M');
  217.    AVL = inserir (AVL, 'E');
  218.    AVL = inserir (AVL, 'W');
  219.    AVL = inserir (AVL, 'X');
  220.    AVL = inserir (AVL, 'S');
  221.    AVL = inserir (AVL, 'F');
  222.    AVL = inserir (AVL, 'G');
  223.    AVL = inserir (AVL, 'A');
  224.    AVL = inserir (AVL, 'H');
  225.    AVL = inserir (AVL, 'N');
  226.    AVL = inserir (AVL, 'O');
  227.    AVL = inserir (AVL, 'P');
  228.    AVL = inserir (AVL, 'R');
  229.  
  230.     imprimir_in_order (AVL, 0);
  231.  
  232.    /*Complete!!!*/
  233.  
  234.    //AVL = remover (AVL, 'A');
  235.    //AVL = remover (AVL, 'H');
  236.    //AVL = remover (AVL, 'E');
  237.    //AVL = remover (AVL, 'W');
  238.    //AVL = remover (AVL, 'G');
  239.    //AVL = remover (AVL, 'N');
  240.    //AVL = remover (AVL, 'P');
  241.    //AVL = remover (AVL, 'O');
  242.  
  243.    imprimir_in_order (AVL, 0);
  244.  
  245.    return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement