Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Árvore Binaria Busca

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;
}
3 respostas

Qual a sua dificuldade? Qual erro acontece? Precisamos de um pouco mais de informações para tentar ajudar..

oi Pedro

Sabe identificar pra gente onde está dando erro e em que caso?

solução!

Aparece o seguinte erro em várias linhas no qual uso o ponteiro. [Error] request for member 'esq' in ' r', which is of pointer type 'Abb {aka _abb}' (maybe you meant to use '->' ?)