Escolar Documentos
Profissional Documentos
Cultura Documentos
h>
#include <stdlib.h>
#include <windows.h>
#include <locale.h>
///ARVORE Arvore
typedef struct arvore
{
int info;
int fb;
struct arvore *esq;
struct arvore *dir;
} Arvore;
///PROT�TIPOS ABB
Arvore *Ler(FILE *p);
void EmOrdem(Arvore *a);
void Largura (Arvore *a);
void Notacao (Arvore *a);
int Existe (Arvore *a, int x);
void MenorMaior (Arvore *a, int x, int y);
int Entre (Arvore *a, int x, int y);
int Folha(Arvore *a);
void MaiorIgual(Arvore *a, int x);
int Altura(Arvore *a);
void imprimir_nivel(Arvore *a, int cont, int nivel);
int NivelNo (Arvore *a, int x);
///PROT�TIPOS AVL
Arvore * CalculaFB(Arvore *a);
Arvore * RotationRightSimples (Arvore *a);
Arvore * RotationLeftSimples (Arvore *a);
Arvore * RotationRight (Arvore *a);
Arvore * RotationLeft (Arvore *a);
Arvore * RotationRightDupla (Arvore *a);
Arvore * RotationLeftDupla (Arvore *a);
Arvore * Inserir (Arvore * a, int x, int *hmudou);
Arvore * Remover (Arvore *r, int x, int *hMudou);
void Printar () {
printf("BEM VINDO AO TRABALHO DE AVL DE LEO SANCHES E DANIEL HENRY\n");
Sleep(50);
printf("Selecione uma op��o abaixo:\n\n");
Sleep(50);
printf("0) Sair\n");
Sleep(50);
printf("1) Ler uma arvore de um arquivo, o nome do arquivo deve ser fornecido
pelo usuario\n");
Sleep(50);
printf("2) Inserir novo n�\n");
Sleep(50);
printf("3) Remover n�\n");
Sleep(50);
printf("4) Imprimir em largura\n");
Sleep(50);
printf("5) Imprimir em nota��o\n");
Sleep(50);
printf("6) Imprimir valores menores que x ou maiores que y(x<y)\n");
Sleep(50);
printf("7) Contar o n�mero de elementos entre x e y\n");
Sleep(50);
printf("8) Imprimir as folhas de valor maior ou igual a x\n");
Sleep(50);
printf("9) Verificar se no existe na arvore\n");
Sleep(50);
}
int main()
{
setlocale(LC_ALL,"");
Arvore *a;
int menu = -1;
int alce1, alce2, alce3;
int *hmudou = 0;
while (menu != 0)
{
system("CLS");
Printar();
setbuf(stdin, NULL);
scanf("%d", &menu);
if (menu == 1)
{
char arqnome[100];
printf("//com a extens�o\n");
printf("Insira o nome do arquivo: ");
scanf("%s", arqnome);
FILE *p = fopen(arqnome, "r");
if (p == NULL)
printf("ERRO! O arquivo n�o foi aberto!\n");
else
{
printf("O arquivo foi aberto com sucesso!\n\n");
a = Ler(p);
printf("Arvore:\n");
Largura(a);
}
setbuf(stdin, NULL);
getchar();
}
if (menu == 2)
{
printf("Que valor deseja inserir? ");
scanf("%d", &alce1);
a = Inserir(a, alce1, &hmudou);
printf("Inserido e balanceado :3\n");
setbuf(stdin, NULL);
getchar();
}
if (menu == 3)
{
printf("Qual valor deseja remover? ");
scanf("%d", &alce1);
if (Existe(a, alce1) == 1)
{
a = Remover(a, alce1, &hmudou);
printf("Removido e balanceado:3\n");
}
else
{
printf("Valor inexistente na arvore :/\n\n\n");
}
setbuf(stdin, NULL);
getchar();
}
if (menu == 4)
{
system("CLS");
Largura(a);
setbuf(stdin, NULL);
getchar();
}
if (menu == 5)
{
system("CLS");
Notacao(a);
setbuf(stdin, NULL);
getchar();
}
if (menu == 6)
{
system("CLS");
printf("Digite um valor para x: ");
scanf("%d", &alce1);
alce2 = alce1;
while (alce2<=alce1)
{
printf("(x<y)\n");
printf("Digite um valor para y: ");
scanf("%d", &alce2);
}
MenorMaior(a, alce1, alce2);
setbuf(stdin, NULL);
getchar();
}
if (menu == 7)
{
system("CLS");
printf("Digite um valor para x: ");
scanf("%d", &alce1);
alce2 = alce1;
while (alce2<=alce1)
{
printf("(x<y)\n");
printf("Digite um valor para y: ");
scanf("%d", &alce2);
}
printf("Existem %d elementos entre x e y", Entre(a, alce1, alce2));
setbuf(stdin, NULL);
getchar();
}
if (menu == 8)
{
printf("Digite um valor para x: ");
scanf("%d", &alce1);
MaiorIgual(a, alce1);
setbuf(stdin, NULL);
getchar();
}
if (menu == 9)
{
printf("Qual valor deseja verificar? ");
scanf("%d", &alce1);
if (Existe(a, alce1) == 1)
{
printf("Existe :3\n");
}
else
{
printf("Valor inexistente na arvore :/\n\n\n");
}
setbuf(stdin, NULL);
getchar();
}
if (menu == 11)
{
printf("FUN��O SECRETA: N�VEL DO N�!\n");
printf("Qual no deseja verificar? ");
scanf("%d", &alce1);
if (Existe(a, alce1) == 1)
{
printf("O n�vel do n� � %d", NivelNo(a, alce1));
}
else
{
printf("Valor inexistente na arvore :/\n\n\n");
}
setbuf(stdin, NULL);
getchar();
}
}
LiberaArvore(a);
}
}
}
a->fb = -1-a->esq->fb;
a->esq->fb = a->esq->fb+1;
alce2 = a->esq;
a->esq = alce1;
a = alce2;
return a;
}
a->fb = 1-a->dir->fb;
a->dir->fb = a->dir->fb-1;
alce2 = a->dir;
a->dir = alce1;
a = alce2;
return a;
}
free(r);
*hMudou = 1;
return aux;
}
//Nenhum filho nulo
else {
Arvore *maiorEsq = r->esq;
while (maiorEsq->dir != NULL)
maiorEsq = maiorEsq->dir;
r->info = maiorEsq->info;
r->esq = Remover(r->esq,r->info,hMudou);
if (*hMudou == 1) {
switch(r->fb)
{
case -1:
r->fb = 0;
*hMudou = 1;
break;
case 0:
r->fb = 1;
*hMudou = 0;
break;
case +1:
{
int aux = r->dir->fb;
r = RotationLeft(r);
if (aux == 0)
*hMudou = 0;
else
*hMudou = 1;
break;
}
}
}
}
}
else if (x < r->info) {
r->esq = Remover(r->esq, x, hMudou);
if (*hMudou == 1) {
switch(r->fb)
{
case -1:
r->fb = 0;
*hMudou = 1;
break;
case 0:
r->fb = 1;
*hMudou = 0;
break;
case +1:
{
int aux = r->dir->fb;
r = RotationLeft(r);
if (aux == 0)
*hMudou = 0;
else
*hMudou = 1;
break;
}
}
}
}
else {
r->dir = Remover(r->dir, x, hMudou);
if (*hMudou == 1) {
switch(r->fb)
{
case +1:
r->fb = 0;
*hMudou = 1;
break;
case 0:
r->fb = -1;
*hMudou = 0;
break;
case -1:
{
int aux = r->esq->fb;
r = RotationRight(r);
if (aux == 0)
*hMudou = 0;
else
*hMudou = 1;
break;
}
}
}
}
return r;
}
}