Algoritmo de Árvore AVL

Pessoal, estou com um problema nas rotações da árvore. Os nós somem quando acontece a rotação. Segue o código:
#include <stdio.h>
#include <stdlib.h>

typedef struct arvore {
int dados;
int altura;
struct arvore *dir;
struct arvore *esq;
} Arv;

Arv *raiz;

// Retorna o maior valor entre x e y

int max(int x, int y) {
if (x > y)
return x;
return y;
}

//Retorna a altura do nó

int altura_No(Arv *arv) {
if (arv == NULL) {
return 0;
}
return arv->altura;
};

// Aplica a altura à todos os nós da árvore

int aplicaALTURA(Arv* arv) {
arv->altura = max(altura_No(arv->esq), altura_No(arv->dir)) + 1;
return arv->altura;
}

//Retorna o fator de balanceamento do nó

int fat_bal(Arv* arv) {
return (altura_No(arv->esq) - altura_No(arv->dir));
}

Arv* rotacaoEsquerda(Arv *arv) {
Arv *tmp = arv->dir;
arv->dir = tmp->esq;
tmp->esq = arv;
return tmp;
}

Arv* rotacaoDireita(Arv *arv) {
Arv *tmp = arv->esq;
arv->esq = tmp->dir;
tmp->dir = arv;
return tmp;
}

Arv* inserir(Arv** arv, int v) {
if (*arv == NULL) {
Arv No = (Arv) malloc(sizeof (Arv));
No->dados = v;
No->dir = NULL;
No->esq = NULL;
No->altura = 0;
*arv = No;
} else {
Arv *tmp = *arv;
if (v < tmp->dados) {
inserir(&tmp->esq, v);
tmp->altura = aplicaALTURA(tmp);
//rotação
if(fat_bal(tmp) == 2){
if(fat_bal(tmp->esq) == 1){
*tmp = rotacaoDireita(*tmp);
}
(*tmp).esq = rotacaoDireita((*tmp).esq);
*tmp = rotacaoEsquerda(*tmp);
}

    } else {
        inserir(&tmp->dir, v);
        tmp->altura = aplicaALTURA(tmp);
        //rotação
        if(fat_bal(tmp) == -2){
            if(fat_bal(tmp->dir) == -1){
                *tmp = rotacaoEsquerda(*tmp);
            }
            (*tmp).dir = rotacaoEsquerda((*tmp).dir);
            *tmp = rotacaoDireita(*tmp);
        }
    }
}

}

void listar(Arv *arv) {
if (arv != NULL) {
printf(“No = %d, altura = %d, FATBAL = %d\n”, arv->dados, arv->altura, arv->fatbal);
listar(arv->esq);
listar(arv->dir);
}
}

int main() {
raiz = NULL;
int op, valor;
while (1) {
printf("------------------------------"
"\n| 0- Sair;"
"\n| 1- Inserir;"
"\n| 2- Listar;"
"\n------------------------------"
"\n\n| Opcao: “);
scanf(”%d", &op);
switch (op) {
case 0:
exit(0);
break;
case 1:
printf("\nInforme o valor: “);
scanf(”%d", &valor);
inserir(&raiz, valor);
break;
case 2:
if (raiz == NULL) {
printf("\n| Arvore vazia!\n\n");
} else {
printf("\n");
listar(raiz);
printf("\n\n");
}
break;
}
}
}

1 curtida

Eu mudei seu programa um pouquinho, pra ficar mais claro pra mim, e além disso corrigi diversos erros tanto de implementação quanto de sintaxe e semantica, e separei definições de declarações, criando um header. Eu estou acostumado a programar em ingles e me sinto desconfortável programando em portugues. Mantive o que pude em portugues, em alguns casos não consegui me conter e troquei certos nomes, como “no” por “node” e “arv” por “tree”, entre outros.

ai o codigo:

1 curtida

Valeu cara, ficou massa! Que pena que você não respondeu logo… mas obrigado mesmo assim!!

É que entrei no forum a pouco tempo.