Imprimir árvore por nível

Alguem sabe algum método que faça isso?

Exemplo:

       1
     /   \
   2      3
 /   \   /  \

4 5 6 7

É pra imprimir 1,2,3,4,5,6,7

VLW

Também preciso de um método que implemente essa mesma idéia…
Da uma luz ai pessoal…
Valeuu

Não sei se intendi bem, mas parece facil. É só utilizar alguns printlines.

System.out.println("1");
System.out.println("/\");
System.out.println("2 3");
System.out.println("/\/\");
System.out.println("4567");
2 curtidas

hehe…
Gostei da tentativa…
Mas o meu problema por exemplo já é diferente …
no meu caso é fazer uma consulta em um banco de dados que está estruturado em forma de arvore…
Categorias…Subcategorias
Pais…Filhos…

mas ainda não achei uma maneira de fazer isso…

Alguem pode ajudar…???

Bom, no caso eu intendi errado…rs :oops:
Desculpe-me.

Eu passo a pergunta para alguem mais gabaritado! :wink:

Não cara… não é println nao… kkkkkk mas vlw

É uma estrutura de dados… na verdade é uma árvore AVL… ai depois que ela está estruturada daquela maneira é necessario que se imprima os valores dos nos nivel por nivel como eu expliquei

[quote=Oliveira_SP]Não sei se intendi bem, mas parece facil. É só utilizar alguns printlines.

System.out.println("1");
System.out.println("/\");
System.out.println("2 3");
System.out.println("/\/\");
System.out.println("4567");

[/quote]

UHAEUHAEUHAUHEEAUHEHUAEUHAEUHEAHUEAHU !!!

essa foi muito boa cara :smiley:

Mas vai usar recursividade galera…
É um algoritmo para percorrer a arvore chamado pré-ordem =) (ele é recursivo)

Vou tentar explicar:

  1. Visita o nó
  2. Percorre sub-arvore esquerda
  3. Percorre sub-arvore direita

farei pseudo-codigo:

procedimento preordem(no) se (no != null) entao imprime(no.informacao); preordem(nodaesquerda); preordem(nodadireita); fim do se

Mole não ??

isso imprime 1,2,3,4,5,6,7

Facam o teste de mesa…

Abraços,

Renan

e ai

acho que você pode usar a busca em largura.

não sei se eu entendi tb … hehehe … mais ou menos assim …

[code]
void Percorre() {
LinkedList fila = new LinkedList();
fila.add(ROOT);
while(fila.size() != 0) {
NO r = fila.remove();
System.out.println(r.Numero + " ");
if(r->FilhoEsq != null) fila.add(r->FilhoEsq);
if(r->FilhoDir != null) fila.add(r->FilhoDir);
}
}

public class NO {
int Numero;
NO FilhoEsq = null;
NO FilhoDir = null;
}[/code]

Pelo menos eu tentei =D

Um dia eu aprendo :wink:

Eu implementei isso uma vez usando funçao recursiva.

lia todos os registros do banco (usando alguns where’s é claro) :slight_smile:
jogava isso num array
lia com funçao recursiva o array para montar a arvore…

não é a forma mais eficiente (creio eu, não parei para pensar em outra forma depois) mas funciona.

[quote=renan_][quote=Oliveira_SP]Não sei se intendi bem, mas parece facil. É só utilizar alguns printlines.

System.out.println("1");
System.out.println("/\");
System.out.println("2 3");
System.out.println("/\/\");
System.out.println("4567");

[/quote]

UHAEUHAEUHAUHEEAUHEHUAEUHAEUHEAHUEAHU !!!

essa foi muito boa cara :smiley:

Mas vai usar recursividade galera…
É um algoritmo para percorrer a arvore chamado pré-ordem =) (ele é recursivo)

Vou tentar explicar:

  1. Visita o nó
  2. Percorre sub-arvore esquerda
  3. Percorre sub-arvore direita

farei pseudo-codigo:

procedimento preordem(no) se (no != null) entao imprime(no.informacao); preordem(nodaesquerda); preordem(nodadireita); fim do se

Mole não ??

isso imprime 1,2,3,4,5,6,7

Facam o teste de mesa…

Abraços,

Renan[/quote]

Não creio que em pré ordem isso funciona… em pré ordem sairia, 1,2,4,5,3,6,7

[quote=renan_][quote=Oliveira_SP]Não sei se intendi bem, mas parece facil. É só utilizar alguns printlines.

System.out.println("1");
System.out.println("/\");
System.out.println("2 3");
System.out.println("/\/\");
System.out.println("4567");

[/quote]

UHAEUHAEUHAUHEEAUHEHUAEUHAEUHEAHUEAHU !!!

essa foi muito boa cara :smiley:

Mas vai usar recursividade galera…
É um algoritmo para percorrer a arvore chamado pré-ordem =) (ele é recursivo)

Vou tentar explicar:

  1. Visita o nó
  2. Percorre sub-arvore esquerda
  3. Percorre sub-arvore direita

farei pseudo-codigo:

procedimento preordem(no) se (no != null) entao imprime(no.informacao); preordem(nodaesquerda); preordem(nodadireita); fim do se

Mole não ??

isso imprime 1,2,3,4,5,6,7

Facam o teste de mesa…

Abraços,

Renan[/quote]

Na verdade esse algoritmo imprime 1,2,4,5,3,6,7.

Facam as devidas mudancas.

Att,

Renan

Isso mesmo Oliveira…Oque importa é tentar ajudar,
nao importa como…
continua assim cara…
Eu to tentando verificar as dicas do pessoal ai pra tentar resolver o meu problema da recursividade …

UHAEUHAEUHAUHEEAUHEHUAEUHAEUHEAHUEAHU !!!

essa foi muito boa cara

Mas vai usar recursividade galera…
É um algoritmo para percorrer a arvore chamado pré-ordem =) (ele é recursivo)

Vou tentar explicar:

  1. Visita o nó
  2. Percorre sub-arvore esquerda
  3. Percorre sub-arvore direita

farei pseudo-codigo:

view plaincopy to clipboardprint?
procedimento preordem(no)
se (no != null) entao
imprime(no.informacao);
preordem(nodaesquerda);
preordem(nodadireita);
fim do se
procedimento preordem(no)
se (no != null) entao
imprime(no.informacao);
preordem(nodaesquerda);
preordem(nodadireita);
fim do se

Mole não ??

isso imprime 1,2,3,4,5,6,7

Facam o teste de mesa…

Abraços,

Renan

Na verdade esse algoritmo imprime 1,2,4,5,3,6,7.

Facam as devidas mudancas.

Att,

Renan

raffccc 11/12/2007 20:59:59 Assunto: Re:Imprimir árvore por nível


renan_ wrote:
Oliveira_SP wrote:
Não sei se intendi bem, mas parece facil. É só utilizar alguns printlines.

view plaincopy to clipboardprint?
System.out.println(“1”);
System.out.println("/\");
System.out.println(“2 3”);
System.out.println("/\/\");
System.out.println(“4567”);
System.out.println(“1”);
System.out.println("/\");
System.out.println(“2 3”);
System.out.println("/\/\");
System.out.println(“4567”);

UHAEUHAEUHAUHEEAUHEHUAEUHAEUHEAHUEAHU !!!

essa foi muito boa cara

Mas vai usar recursividade galera…
É um algoritmo para percorrer a arvore chamado pré-ordem =) (ele é recursivo)

Vou tentar explicar:

  1. Visita o nó
  2. Percorre sub-arvore esquerda
  3. Percorre sub-arvore direita

farei pseudo-codigo:

view plaincopy to clipboardprint?
procedimento preordem(no)
se (no != null) entao
imprime(no.informacao);
preordem(nodaesquerda);
preordem(nodadireita);
fim do se
procedimento preordem(no)
se (no != null) entao
imprime(no.informacao);
preordem(nodaesquerda);
preordem(nodadireita);
fim do se

Mole não ??

isso imprime 1,2,3,4,5,6,7

Facam o teste de mesa…

Abraços,

Renan

[quote]Não creio que em pré ordem isso funciona… em pré ordem sairia, 1,2,4,5,3,6,7

Eu implementei isso uma vez usando funçao recursiva.

lia todos os registros do banco (usando alguns where’s é claro)
jogava isso num array
lia com funçao recursiva o array para montar a arvore…

não é a forma mais eficiente (creio eu, não parei para pensar em outra forma depois) mas funciona. [/quote]

Na verdade eu até bolei uma solucao manulando um array como o nosso amigo citou antes aii…
Mas gostaria de algo para nao precisar fazer isso…
fazendo com que ficasse com níveis ilimitados

A arvore em questao nao se trata de uma arvore de busca binária . Será necessario um condicional verificando quem é maior que quem ( if(esquerda>direita) ) … Algo assim para se conseguir imprimir da forma que deseja.

Att,

Renan

entaum kra…eu fiz aki mas em pascal…vou postar o algoritmo espero q te seja util…adapte-o conforme precisar

eu usei duas filas…a Fila F é a q irá armazenar o valor pra posteriormente serem exibidos, no seu caso, e a Fila FE é a Fila q auxiliará para andarmos na arvore. No fim vc terá a Fila F, preenchida pelos niveis, ai é só exibi-la
Espero ter ajudado, e naum ter problema em colocar procedimentos em pascal aki… :oops:

Procedure TransLista(var raiz:tree);
var F,FE:TpFila;
begin
Init(F);
Init(FE);
Enqueue(F,raiz); {Empilha F}
Enqueue(FE,raiz); {Empilha FE}
while not IsEmpty(FE) do
begin
Dequeue(FE,raiz); {Desempilha FE}
if (raiz^.esq<>nil) then
begin
Enqueue(F,raiz^.esq); {Empilha F}
Enqueue(FE,raiz^.esq);{Empilha FE}
end;
if (raiz^.dir<>nil ) then
begin
Enqueue(F,raiz^.dir); {Empilha F}
Enqueue(FE,raiz^.dir);{Empilha FE}
end;
end;
end;

Pré-ordem não imprime isso do jeito que vc quer não. Aplique o pré-order mentalmente nessa árvore que vc colocou como exemplo e vc vai ver que ele imprime todos os nodos à esquerda da árvore, antes de imprimir os da direita.

O que vc realmente quer é uma pesquisa em largura (ou breadth-first search), que imprime todos os nodos pais antes de imprimir os seus filhos, ou seja, imprime um nível da árvore de cada vez. É fácil descobrir como implementar esse algorítmo. Google it.