Boa noite,
Estou fazendo uma atividade da faculdade para criar uma árvore binaria de busca no entanto estou com dificuldades nos ponteiros. Se for possível ajuda agradeço desde já.
typedef struct _abb *Abb;
struct abb {
int chave;
Abb* pai;
Abb* esq;
Abb* dir;
};
Abb* abb_cria (void);
Abb* abb_insere (Abb* raiz, int val);
Abb* abb_retira (Abb* raiz, int val);
Abb* abb_busca (Abb* raiz, int val);
Abb* abb_cria_filho (Abb* pai, int val);
#include <stdio.h>
#include <stdlib.h>
#include "abb.h"
Abb* abb_cria (void){ //Cria uma arvore
return NULL;
}
Abb* abb_busca (Abb* r, int v){ //Busca elemento na arvore
if (r == NULL){
return NULL;
}else if (v<r->chave) {
return abb_busca (r->esq,v);
}else if (v>r->chave){
return abb_busca (r->dir, v);
}else return r;
}
Abb* abb_cria_filho(Abb* pai, int v){ //Aloca memoria e cria o no
abb* no = (abb*) malloc(sizeoff(abb));
no->chave = val;
no->pai = pai;
no->dir = no->esq = NULL;
return no;
}
Abb* abb_insere (Abb* r, int v){ //Inserir elemento
if (r == NULL){
return abb_cria_filho (r, val);
}else if (val < r->chave){
if (r->esq == NULL){
return abb_cria_filho (r, val);
}else {
r->esq = abb_insere (r->esq, val);
}
}
else if (val > r->chave){
if (r->dir == NULL){
return abb_cria_filho(r, val);
}else {
r->dir = abb_insere (r->dir, v);
}
return r;
}
}
Abb* abb_retira (Abb* r, int val){ //Retirar Elemento
if (r == NULL){
return NULL;
}else if (val < r->chave){
r->esq = abb_retira(r->esq, val);
}else if (val > r->chave){
r->dir = abb_retira(r->dir, val);
}else { //Quando ele encontra o NO a ser removido
if (r->esq == NULL && r->dir == NULL){ //Aqui ele não possui filhos
free (r); r = NULL;
}else if (r->esq == NULL){
abb* t = r; r = r->dir; r->pai = t->pai; free(t); // Dúvida nessas linhas
}else if (r->dir == NULL){
abb* t = r; r = r->esq; r->pai = t->pai; free (t);// Dúvida nessas linhas
}else { //Neste caso o no tem 2 filhos, busca sucessor
abb* sucessor = r->dir;
while (sucessor->esq != NULL){
sucessor = sucessor->esq;
r->chave = sucessor->chave; //Troca as chaves
sucessor->chave = val;
}if (sucessor->pai->esq == sucessor){ //Liga o filho do sucessor ao avo
sucessor->pai->esq = sucessor->dir; //Se o sucessor for o filho a esquerda
}else {
sucessor->pai->dir = sucessor->dir; //Se o sucessor for o filho a direita
}if (sucessor->dir != NULL){
sucessor->dir->pai = sucessor->pai;
free (sucessor);
}
}
}return r;
}
int main (){
Abb* a;
int escolha 1;
int x = 0;
do {
printf("\n\n\n");
printf("########################################\n\n");
printf("Digite a opcao desejada:\n");
printf("1-> Inicializar arvore.\n");
printf("2-> Inserir Elemento.\n");
printf("3-> Retirar Elemento.\n");
printf("4-> Buscar elemento.\n");
printf("\n\n#####################################\n\n\n\n\n->");
scanf("%d", &escolha);
fflush(stdin);
printf("\n\n");
switch (escolha){
case 1:
a = abb_cria();
if (a == NULL){
printf ("Arvore inicializada com sucesso!\n");
printf("\n\n\n");
break;
}
case 2:
printf("Digite o elemento a ser inserido na arvore:\n");
scanf("%d", &x);
fflush(stdin);
a = abb_insere(a, x);
printf("\n\n\n");
break;
case 3:
printf ("Digite o elemento a ser retirado na arvore:\n");
scanf ("%d", &x);
fflush(stdin);
a = abb_retira(a, x);
printf ("\n\n\n");
break;
case 4:
printf ("Digite o elemento que você deseja buscar:\n");
scanf ("%d", &x);
fflush(stdin);
a = abb_busca (a, x);
printf ("\n\n\n");
break;
}
}while (escolha != 0); // 0 para fechar o menu
return 0;
}