Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

1. Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

José Helder
raikone14

(usa Debian)

Enviado em 24/11/2013 - 12:58h

Boa tarde galera,to tentando fazer uma função que mostra somente as folhas de uma árvore binaria em c.
Só que to meio travado.
Segue minha função de mostraflohas:

void MostraFolhas(Arv *a){

if(a !=NULL){
if(a->esq == NULL && a->dir == NULL){



printf("%d\t", a->info);
}
}
MostraFolhas(a->esq);
MostraFolhas(a->dir);

}



Meu código todo:http://pastebin.com/GaC8v12f
Porém acho que o erro está nessa função acima mesmo,pois o restante funciona normal.
Se alguém puder ajudar,agradeço muito...Obrigado


  


2. Re: Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

José Helder
raikone14

(usa Debian)

Enviado em 24/11/2013 - 17:44h

Sam L. escreveu:

A função MostraFolhas deve retornar assim que atingir as folhas e mostrar o "info". Pois se não retornar dará erro. Mas ainda tem um detalhe, o primeiro if deveria conter o MostraFolhas(a->esq) e MostraFolhas(a->dir), pois se a for NULL a função executará e dará falha de segmentação.

Modificando a função fica:
void MostraFolhas(Arv *a)
{
// OU poderia retornar assim que "a" fosse NULL
// if (a == NULL)
// return;
if(a != NULL)
{
if(a->esq == NULL && a->dir == NULL)
{
printf("%d\t", a->info);
return;
}

MostraFolhas(a->esq);
MostraFolhas(a->dir);
}
}



cara eu fiz as mudanças que vc falou,porém ainda tem um pequeno erro,eu inseri a seguinte árvore:http://imageshack.com/a/img9/4103/8m4j.png
e a função mostrou "4,5,11",sendo q só deveria mostrar "5,11"
sabe oq pode ser?
Obrigado


3. Re: Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

José Helder
raikone14

(usa Debian)

Enviado em 24/11/2013 - 22:05h

Sam L. escreveu:

Cara o problema agora ta na função abb_insere, quando é para inserir o valor 5, ela entra para direita no primeiro nó, isso por causa do operador lógico "<" da expressão "v < a->info", para ir certo deveria ser "v <= a->info". Assim ele entra para esquerda se o valor for menor ou igual ao nó atual.


vlwsss,mano,eu mudei aqui e foi...
será que teria como listar somente os nós com dois filhos?brigado


4. Re: Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

José Helder
raikone14

(usa Debian)

Enviado em 24/11/2013 - 23:51h

Sam L. escreveu:

raikone14 escreveu:

Sam L. escreveu:

Cara o problema agora ta na função abb_insere, quando é para inserir o valor 5, ela entra para direita no primeiro nó, isso por causa do operador lógico "<" da expressão "v < a->info", para ir certo deveria ser "v <= a->info". Assim ele entra para esquerda se o valor for menor ou igual ao nó atual.


vlwsss,mano,eu mudei aqui e foi...
será que teria como listar somente os nós com dois filhos?brigado


Sim, bastaria percorrer cada nó e se o nó tiver os dois filhos diferentes de NULL, então você faria algo com ele, como imprimir o "info". É quase a mesma coisas da função MostraFolhas.


mas eu não poderia usar essas funções de mostra né? teria que fazer uma fução com logica diferente.
pois como eu checaria se ele tem dois filhos?


5. Re: Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

José Helder
raikone14

(usa Debian)

Enviado em 25/11/2013 - 00:21h

Sam L. escreveu:

Cara se ele tem os dois filhos eles serão não nulos entendeu? Por exemplo, se a->esq é diferente de NULL e ao mesmo tempo a->dir é diferente de NULL então "a" tem os dois filhos completos.
Se um dos filhos é NULL então obviamente não tem dois filhos "completos".
E sim você deve fazer outra função, eu falei de MostraFolhas apenas como exemplo.




é amigo,eu fiz algo assim,e não foi..... vc falou algo parecido?
assim ele só mostra a raiz.


void MOstra_dois filhos(Arv *a){

if(a==NULL)
return;

if(a !=NULL){
if(a->esq != NULL && a->dir != NULL){



printf("%d\t", a->info);
return;
}

}
MOstra_dois filhos(a->esq);
MOstra_dois filhos(a->dir);

}




6. Re: Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

José Helder
raikone14

(usa Debian)

Enviado em 25/11/2013 - 01:24h

Sam L. escreveu:

void MOstra_dois filhos(Arv *a){

if(a==NULL)
return;

if(a !=NULL){
if(a->esq != NULL && a->dir != NULL){



printf("%d\t", a->info);
return;
}

}
MOstra_dois filhos(a->esq);
MOstra_dois filhos(a->dir);

}

O if (a != NULL) é redundante, pois com primeiro if já é possível ter certeza que "a" é não nulo, então apague o "if (a != NULL)".
No bloco do if(a->esq != NULL && a->dir != NULL) não se deve retornar, pois outros nós podem ter filhos completos então remova a linha com return.


desculpa cara encher seu saco,mas é que to querendo apreender essa bagaça. :D
então eu fiz a seguinte àrvore:http://imageshack.us/photo/my-images/440/7z0i.png/

e usando essa função que vc passou,ele só retornou o 8.
o certo não seria ele mostrar 8,4 e 10?
Muitíssimo obrigado por seu tempo ai brother...



7. Re: Algoritmo para mostrar folhas de uma árvore binaria. [RESOLVIDO]

José Helder
raikone14

(usa Debian)

Enviado em 25/11/2013 - 17:28h

Sam L. escreveu:

Você deve ter esquecido de retirar o return como eu indiquei. Aqui eu fiz as modificações que falei e funcionou direito.
cara só não coloco a função pronta porque você deve fazer as coisas "só", isso faz bem e não mata rsrs.





Muito obrigado por tudo amigo,vc poderia dar uma ultima explicada nesses return's do mostra com dois filhos,me perde um pouco...
Mas muito obrigado por tudo de qualquer forma....









Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts