Código de árvore binária
Olá, pessoal.
Como prometido, aqui está o código da árvore binária de busca. Lembrem-se: implementem o balanceamento (Árvore AVL) e entreguem até o dia 21/04/15 via e-mail.
#include <stdio.h>
#include <stdlib.h>
/* Estrutura de um nó */
struct no
{
int chave;
struct no *p;
struct no *e;
struct no *d;
};
/* Calcula a altura de uma árvore */
int altura(struct no *raiz)
{
if(raiz == NULL)
return 0;
int e = altura(raiz->e);
int d = altura(raiz->d);
int m;
if (e > d)
m = e;
else
m = d;
return m + 1;
}
/* Calcula o fator de balanceamento de um nó */
int balanceamento(struct no *raiz)
{
return altura(raiz->d) - altura(raiz->e);
}
/* Cria um nó */
struct no *criar(int chave)
{
struct no *novo = malloc(sizeof(struct no));
novo->chave = chave;
novo->p = novo->e = novo->d = NULL;
}
/* Busca um nó na árvore */
struct no *buscar(struct no *raiz, int chave)
{
if(raiz == NULL)
return NULL;
if(raiz->chave == chave)
return raiz;
if(chave > raiz->chave)
return buscar(raiz->d,chave);
else
return buscar(raiz->e,chave);
}
/* Adiciona elemento na árvore */
struct no *adicionar(struct no *raiz, int chave)
{
if (raiz == NULL)
{
struct no *novo = criar(chave);
return novo;
}
if (chave < raiz->chave)
{
struct no *novo = adicionar(raiz->e, chave);
raiz->e = novo;
novo->p = raiz;
}
else
{
struct no *novo = adicionar(raiz->d, chave);
raiz->d = novo;
novo->p = raiz;
}
return raiz;
}
/* Imprime a árvore em ordem */
void emordem(struct no *raiz)
{
if (raiz == NULL)
return;
emordem(raiz->e);
printf("%d ",raiz->chave);
emordem(raiz->d);
}
/* Imprime a árvore em pré-ordem */
void preordem(struct no *raiz)
{
if (raiz == NULL)
return;
printf("%d ",raiz->chave);
preordem(raiz->e);
preordem(raiz->d);
}
/* Imprime a árvore em pós-ordem */
void posordem(struct no *raiz)
{
if (raiz == NULL)
return;
posordem(raiz->e);
posordem(raiz->d);
printf("%d ",raiz->chave);
}
/* Retorna o mínimo de uma árvore */
struct no *minimo(struct no *raiz)
{
if (raiz == NULL)
return;
if (raiz->e == NULL)
return raiz;
return minimo(raiz->e);
}
/* Retorna o máximo de uma árvore */
struct no *maximo(struct no *raiz)
{
if (raiz == NULL)
return;
if (raiz->d == NULL)
return raiz;
return maximo(raiz->d);
}
/* Retorna o antecessor de um nó */
struct no *antecessor(struct no *raiz)
{
if(raiz->e == NULL)
{
while(raiz->p != NULL && raiz->p->chave > raiz->chave )
raiz = raiz->p;
return raiz->p;
}
return maximo(raiz->e);
}
/* Retorna o sucessor de um nó */
struct no *sucessor(struct no *raiz)
{
if(raiz->d == NULL)
{
while(raiz->p != NULL && raiz->p->chave < raiz->chave )
raiz = raiz->p;
return raiz->p;
}
return minimo(raiz->d);
}
/* Remove um nó da árvore e retorna a nova árvore */
struct no* remover(struct no *arvore, int chave)
{
if(arvore == NULL)
return NULL;
struct no *raiz = buscar(arvore, chave);
if (raiz == NULL)
return arvore;
// Remover NO sem Filhos
if (raiz->e == NULL && raiz->d == NULL)
{
if(raiz->p != NULL)
{
if(raiz->p->chave >= raiz->chave)
raiz->p->e = NULL;
else
raiz->p->d = NULL;
free(raiz);
}
else
{
free(raiz);
return NULL;
}
if (raiz == arvore)
return NULL;
}
else
{
// Remover NO com 2 Filhos
if (raiz->e && raiz->d != NULL)
{
struct no *ant = antecessor(raiz);
raiz->chave = ant->chave;
ant = remover(ant, ant->chave);
}
// Remover NO com 1 Filho
else
{
//Reconectar Filho a Esquerda
if(raiz->e != NULL)
{
if (raiz->p != NULL)
{
if(raiz->p->chave > raiz->chave)//Caso o pai seja maior
raiz->p->e = raiz->e;
else//Caso o pai seja menor
raiz->p->d = raiz->e;
}
raiz->e->p = raiz->p;
}
//Reconectar Filho a Direita
else
{
if (raiz->p != NULL)
{
if(raiz->p->chave < raiz->chave)//Caso o pai seja menor
raiz->p->d = raiz->d;
else//Caso o pai seja maior
raiz->p->e = raiz->d;
}
raiz->d->p = raiz->p;
free(raiz);
}
}
}
return arvore;
}
/* Função principal */
int main(void)
{
struct no *arvore = NULL;
int opt, chave;
do
{
printf("Escolha uma opcao:\n\n");
printf("1 - Adicionar\n");
printf("2 - Listar\n");
printf("3 - Remover\n");
printf("0 - Sair\n");
scanf("%d", &opt);
switch(opt)
{
case 1:
printf("\n\nDigite uma chave: ");
scanf("%d", &chave);
arvore = adicionar(arvore, chave);
break;
case 2:
printf("\n\n");
printf("Em ordem: \n");
emordem(arvore);
printf("\n\n");
printf("Pre ordem: \n");
preordem(arvore);
printf("\n\n");
printf("Pos ordem: \n");
posordem(arvore);
printf("\n\n");
break;
case 3:
printf("\n\nDigite a chave a ser removida: ");
scanf("%d", &chave);
arvore = remover(arvore, chave);
break;
case 0:
return 0;
default:
printf("Opcao invalida!\n\n");
}
}
while(1);
return 0;
}
Leave a Reply