Ir ao conteúdo
  • Cadastre-se

Arvores Binárias Urgente


AlanMafer

Posts recomendados

Preciso escreva uma função que imprima os conteúdos de uma árvore binária com recuos de margem proporcionais à profundidade do nó na árvore.

 

 
555
/ \

333 888
/ \ \
111 444 999

deve se representada assim:

555
           333
                  111
                           -
                           -
                  444
 

eu  já tenho essa função:

 

void ImprimirPreOrder (No *p) 
{
if (p) 
{
cout << p->info << ("\n\t");
ImprimirPreOrder(p->esq);
ImprimirPreOrder(p->dir);
}
}
Link para o comentário
Compartilhar em outros sites

Cara é só você adaptar . . .

#include<stdio.h>#include<stdlib.h>typedef struct arvore{    int numero;    struct arvore *Fesq;    struct arvore *Fdir;    int fb;}arvore;void criarArvore(arvore **arvoreraiz){    *arvoreraiz = NULL;}int inserir(arvore **arvoreraiz, int numero){    if(*arvoreraiz == NULL)    {        *arvoreraiz = (arvore *) malloc(sizeof(arvore));         (*arvoreraiz)->numero = numero;        (*arvoreraiz)->Fesq = NULL;        (*arvoreraiz)->Fdir = NULL;        return 0;    }    else    {        if(numero < (*arvoreraiz)->numero)        {            inserir(&(*arvoreraiz)->Fesq, numero);        }        if(numero > (*arvoreraiz)->numero)            inserir(&(*arvoreraiz)->Fdir, numero);    }    return 0;}int rota(arvore **arvoreraiz){    if((*arvoreraiz)->Fesq==NULL && (*arvoreraiz)->Fdir==NULL)    {        (*arvoreraiz)->fb=0;    }    else    {        if((*arvoreraiz)->Fesq!=NULL)        {            (*arvoreraiz)->fb=(*arvoreraiz)->fb+1;        }        if((*arvoreraiz)->Fdir!=NULL)        {            (*arvoreraiz)->fb=(*arvoreraiz)->fb-1;        }    }    if((*arvoreraiz)->fb==-2)    {        arvore *pika;        pika=*arvoreraiz;        int aux=( *arvoreraiz)->numero;        (*arvoreraiz)=(*arvoreraiz)->Fdir;        inserir(&(*arvoreraiz)->Fesq,aux);        free(pika);    }    else    {        if((*arvoreraiz)->fb==2)        {            arvore *pika;            pika=*arvoreraiz;            int aux=( *arvoreraiz)->numero;            (*arvoreraiz)=(*arvoreraiz)->Fesq;            inserir(&(*arvoreraiz)->Fdir,aux);            free(pika);        }    }    return 0;}arvore *MaiorFdir(arvore **arvoreraiz){    if((*arvoreraiz)->Fdir != NULL)        return MaiorFdir(&(*arvoreraiz)->Fdir);    else{       arvore *aux = *arvoreraiz;       if((*arvoreraiz)->Fesq != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da Fesq!          *arvoreraiz = (*arvoreraiz)->Fesq;       else          *arvoreraiz = NULL;       return aux;       }}arvore *MearvorerFesq(arvore **arvoreraiz){    if((*arvoreraiz)->Fesq != NULL)        return MearvorerFesq(&(*arvoreraiz)->Fesq);    else{       arvore *aux = *arvoreraiz;        if((*arvoreraiz)->Fdir != NULL) // se nao houver essa verificacao, esse nó vai perder todos os seus filhos da Fdir!          *arvoreraiz = (*arvoreraiz)->Fdir;       else          *arvoreraiz = NULL;       return aux;       }} void remover(arvore **arvoreraiz, int numero){    if(*arvoreraiz == NULL){   // esta verificacao serve para caso o numero nao exista na arvore.       printf("Numero nao existe na arvore!");      // getch();       return;    }    if(numero < (*arvoreraiz)->numero)       remover(&(*arvoreraiz)->Fesq, numero);    else        if(numero > (*arvoreraiz)->numero)          remover(&(*arvoreraiz)->Fdir, numero);       else{    // se nao eh mearvorer nem maior, logo, eh o numero que estou procurando!           arvore *pAux = *arvoreraiz;           if (((*arvoreraiz)->Fesq == NULL) && ((*arvoreraiz)->Fdir == NULL)){         // se nao houver filhos...                free(pAux);                (*arvoreraiz) = NULL;                }          else{     // so tem o filho da Fdir             if ((*arvoreraiz)->Fesq == NULL){                (*arvoreraiz) = (*arvoreraiz)->Fdir;                pAux->Fdir = NULL;                free(pAux); pAux = NULL;                }             else{            //so tem filho da Fesq                if ((*arvoreraiz)->Fdir == NULL){                    (*arvoreraiz) = (*arvoreraiz)->Fesq;                    pAux->Fesq = NULL;                    free(pAux); pAux = NULL;                    }                else{       //Escolhi fazer o maior filho direito da subarvore Fesq.                   pAux = MaiorFdir(&(*arvoreraiz)->Fesq); //se vc quiser usar o Mearvorer da Fesq, so o que mudaria seria isso:                   pAux->Fesq = (*arvoreraiz)->Fesq;          //        pAux = MearvorerFesq(&(*arvoreraiz)->Fdir);                   pAux->Fdir = (*arvoreraiz)->Fdir;                   (*arvoreraiz)->Fesq = (*arvoreraiz)->Fdir = NULL;                   free((*arvoreraiz));  *arvoreraiz = pAux;  pAux = NULL;                      }                }             }          }}void exibirEmOrdem(arvore *arvoreraiz){    if(arvoreraiz != NULL){        exibirEmOrdem(arvoreraiz->Fesq);        printf("\n%i", arvoreraiz->numero);        exibirEmOrdem(arvoreraiz->Fdir);    }}void exibirPreOrdem(arvore *arvoreraiz){    if(arvoreraiz != NULL){        printf("\n%i", arvoreraiz->numero);        exibirPreOrdem(arvoreraiz->Fesq);        exibirPreOrdem(arvoreraiz->Fdir);    }}void exibirPosOrdem(arvore *arvoreraiz){    if(arvoreraiz != NULL){        exibirPosOrdem(arvoreraiz->Fesq);        exibirPosOrdem(arvoreraiz->Fdir);        printf("\n%i", arvoreraiz->numero);    }}int contararvores(arvore *arvoreraiz){   if(arvoreraiz == NULL)        return 0;   else        return 1 + contararvores(arvoreraiz->Fesq) + contararvores(arvoreraiz->Fdir);}int contarFolhas(arvore *arvoreraiz){   if(arvoreraiz == NULL)        return 0;   if(arvoreraiz->Fesq == NULL && arvoreraiz->Fdir == NULL)        return 1;   return contarFolhas(arvoreraiz->Fesq) + contarFolhas(arvoreraiz->Fdir);}int maior(int a, int {    if(a >         return a;    else        return b;}   int altura(arvore *arvoreraiz){   if((arvoreraiz == NULL) || (arvoreraiz->Fesq == NULL && arvoreraiz->Fdir == NULL))       return 0;   else       return 1 + maior(altura(arvoreraiz->Fesq), altura(arvoreraiz->Fdir));}   int main()   {       arvore *a;       criarArvore(&a);       int e;       int k=1;       do       {           printf("Digite o elemento que ira insererir: ");           scanf("%d", &e);           printf("\n");           fflush(stdin);           inserir(&a, e);           rota(&a);           printf("Digite 1 para inserir e 2 para remover: ");           scanf("%d", &k);           if(k==2){               int chave;                printf("\nDigite a chave que deseja remover: ");               scanf("%d", &chave);               printf("\n\n");               remover(&a, chave);               rota(&a);               k=1;           }           printf("\n");           fflush(stdin);       }while(k==1);       printf("\nExibir Em Ordem: \n\n");       exibirEmOrdem(a);       printf("\nExibir Em Pos-Ordem: \n\n");       exibirPosOrdem(a);       printf("\nExibir Em Pre-Ordem: \n\n");       exibirPreOrdem(a);       printf("\n");       system("pause");       return 0;   }
Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!