Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Jean Martins

Árvore Binária

Recommended Posts

Olá a Todos!

 

Bom, meu problema é o seguinte, estou implementando ma arvore binaria e preciso realizar um percurso em nivel, ja fiz bastante coisa no codigo, só que não está imprimindo o percurso. Estou usando uma fila para auxiliar no percurso e minha duvida é como passar o ponteiroda fila para dentro da função de percurso, segue abaixo o codigo:

 

Preciso muito de ajuda, ficarei muito agradecido!


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


typedef struct arv
{
   int info;
   struct arv* esq;
   struct arv* dir;
   struct arv* altura;

}arvore;


typedef struct fila
{
   int info;
   struct fila* prox;
}Fila;


void insere(arvore **r,int num);
int calc_no(arvore *r);
void imprime_preordem(arvore *r);
void percurso_nivel(arvore* r);
void insere_fila(Fila **f, arvore **r);
void imprime_fila(Fila* f);
main()
{

   arvore *raiz;
    raiz = NULL;

   int num;
   num = 15;
   insere(&raiz,num);
   num = 10;
   insere(&raiz,num);
   num = 20;
   insere(&raiz,num);
   num = 50;
   insere(&raiz,num);
   num = 8;
   insere(&raiz,num);
   num = 11;
   insere(&raiz,num);
   num = 3;
   insere(&raiz,num);

   printf("\n\nImpressao preordem\n\n");
   imprime_preordem(raiz);
   printf("\n\nnumero de nos da arvore: %d",calc_no(raiz));
   percurso_nivel(raiz);
   return 0;
}

void insere(arvore **r,int num)
{
   arvore *novo_no;

   novo_no = (arvore *)malloc(sizeof(arvore));


   if(*r == NULL)        //verifica se a raiz da arvore esta vazia
   {
       novo_no->info = num;
       novo_no->esq = NULL;
       novo_no->dir = NULL;

       *r = novo_no;
   }

   else
   {
       if((*r)->info < num)    //verifica se é maior que a raiz
       {

           insere(&(*r)->dir,num); // se maior que a raiz, insere no nodo direito.
       }
       else
       {
           insere(&(*r)->esq,num);  // se menor que a raiz, insere no nodo esquerdo.

       }
   }

}

int calc_no(arvore *r)  // funcao para calcular os nós de uma arvore
{

   if (r ==  NULL)
   return 0;

   return 1+ calc_no(r->esq) + calc_no(r->dir);

}


void imprime_preordem(arvore *r)  //pre_ordem
{
   if(r!= NULL)
   {
       printf("%d\n", r->info);
       imprime_inordem(r->esq);
       imprime_inordem(r->dir);
   }

}



void insere_fila(Fila **f, arvore **r)
{
   if(r!= NULL)
   {
       Fila* novo; Fila* ult; Fila* primeiro;

       primeiro = *f;

       novo = (Fila*)malloc(sizeof(Fila));

           if(*f == NULL)
           {

               novo->info = (*r)->info;
               primeiro = novo;
               ult = primeiro;
               novo->prox = NULL;
           }

           novo->info = (*r)->info;
           ult = novo;
           novo->prox = NULL;

   }

}

void imprime_fila(Fila *f)
{
   Fila* i;

   for(i= f; i!=NULL;i= i->prox)
   {
       printf("%d\nresultado:",i->info);
   }
}

void percurso_nivel(arvore* r)
{
 Fila *f;
   f = NULL;

   if(r == NULL)
   {
       return ;
   }
   else
   {

       insere_fila(&f,&r);

       while(f)     // depois que insere na fila uma vez eu preciso atualizar este ponteiro f.
   {
       if(r->esq != NULL)
       {
           insere_fila(&f, &r->esq);
       }


       if(r->dir != NULL)
       {
           insere_fila(&f, &r->dir);
       }
   }
   imprime_fila(f);
   }

}




Compartilhar este post


Link para o post
Compartilhar em outros sites

Da mesma maneira que voce envia o da arvore, mas recebe como tipo fila

 

 

Olá, não entendi bem o que quer dizer. Minha função percore_nivel eu envio a arvore para insere_fila, a função isnere_fila tem que ter retorno do tipo fila?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.