Ir para conteúdo
Fórum Script Brasil
  • 0

Arvore Binária de Busca


CristianeRibeiro

Pergunta

Galera, estou aqui fazendo um trabalho simples de Estrutura de Dados sobre árvore binária de busca...

Bom, o código já tá pronto, só que está dando um erro de compilação que

com certeza é algum erro que eu deixei passar no código, só que não consigo encontrar..

Quem puder me ajudar, muito obrigada!

Código

#include <stdio.h>
#include <stdlib.h>


typedef struct tipo_no{
    int item;
    struct tipo_no *esq;
    struct tipo_no *dir;
}TREE;



void Inicializa(TREE **arvore){
    *arvore = NULL;
}



void insere_elemento(TREE **arvore, int item){

        TREE *p;
        p = *arvore;


    if(*arvore == NULL){
        p = (TREE *)malloc(sizeof(TREE));
        p->item = item;
        p->esq = NULL;
        p->dir = NULL;
    }else{
        if(item < (*arvore)->item)
        insere_elemento(&p->esq, item);
        else
        if(item > p->item)
        insere_elemento(&p->dir, item);
        else
        p->item = item;

    }
}


void esvaziar(TREE **arvore){
    TREE *p;
    p = *arvore;

    esvaziar(&p->esq);
    esvaziar(&p->dir);
    free(p);

}

int max (int a, int b){

    return (a>b ? a : b);
}

int altura (TREE *arvore){
    /* TREE *p;
    p = *arvore;*/
    if(arvore == NULL){
        return -1;
    }
    else{
        return 1 + max(altura(arvore->esq), altura(arvore->dir));
    }
}

void PreOrdem (TREE *arvore){

    if(arvore != NULL){
        printf (" %c", arvore->item);
        PreOrdem(arvore->esq);
        PreOrdem(arvore->dir);
    }
}

void EmOrdem(TREE *arvore){

    if(arvore != NULL){
        EmOrdem(arvore->esq);
        printf (" %c", arvore->item);
        EmOrdem(arvore->dir);
    }
}


void PosOrdem (TREE *arvore){

    if(arvore != NULL){
        PosOrdem(arvore->esq);
        PosOrdem(arvore->dir);
        printf (" %c", arvore->item);
    }
}


main()
{


    TREE *T;

    Inicializa(&T);

    insere_elemento(&T, 98);
    insere_elemento(&T, 44);
    insere_elemento(&T, 11);
    insere_elemento(&T, 26);
    insere_elemento(&T, 41);
    insere_elemento(&T, 59);
    insere_elemento(&T, 26);
    insere_elemento(&T, 60);
    insere_elemento(&T, 71);
    insere_elemento(&T, 22);
    insere_elemento(&T, 12);
    insere_elemento(&T, 30);
    insere_elemento(&T, 32);
    insere_elemento(&T, 42);
    insere_elemento(&T, 51);

    printf("\nPercurso PreOrdem");
    PreOrdem(T);
    printf("\n\nPercurso Em Ordem");
    EmOrdem(T);
    printf("\n\nPercurso PosOrdem");
    PosOrdem(T);

    printf("\n\nAltura da arvore: %d", altura(T));

}

Desde já muito obrigada..

Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Marcelo é o seguinte, ele compila e executa

mas não aparece o resultado...

Acho que a árvore está ficando sempre nula,

o que não satisfaz a condição

if(arvore != NULL), dentro das funções PreOrdem, EmOrdem e PosOrdem...

Bom se você conseguir ver o que é eu agradeço muito,

porque já revirei o codigo não sei quantas vezes e ainda não encontrei o erro.

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, tudo jóia ?

Então, alguns erros que eu notei dando uma olhada rápida:

1º - Você está considerando que o Arvore->Item seja char nas funções xxxOrdem, sendo que ele é int.

2º - Esse é o seu principal erro, quando você aloca memória na função insere_elemento(), você está alocando para a variável *p, e não para a árvore.

Basta mudar o código para esse:

if(*arvore == NULL){
        (*arvore) = (TREE *)malloc(sizeof(TREE));
        (*arvore)->item = item;
        (*arvore)->esq = NULL;
        (*arvore)->dir = NULL;

Vou tentar te explicar o que ocorre com esse erro.

Primeiro você declara a variável *p, depois atribui o endereço de *arvore nela. Só que quando você aloca memória para *p, você simplesmente perde a referencia que tinha da variável *arvore e coloca um outro endereço para a variável *p.

Isso não aconteceria se você fizesse algo assim: p->left = malloc(); pois aí sim você está dando um endereço de memória para um ponteiro que está na variável *arvore.

Se houver algo de errado além disso no seu código é só dar um toque aqui que eu dou uma olhada para você, mas olhando superficialmente é só isso mesmo.

[]'s

Editado por Raist
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...