Como posso imprimir uma árvore binária em Java para que a saída seja como:
4
/ \
2 5
Meu nó:
public class Node<A extends Comparable> {
Node<A> left, right;
A data;
public Node(A data){
this.data = data;
}
}
java
printing
binary-tree
Tian
fonte
fonte
Respostas:
Eu criei uma impressora simples de árvore binária. Você pode usá-lo e modificá-lo como quiser, mas ele não é otimizado. Eu acho que muitas coisas podem ser melhoradas aqui;)
Saída 1:
Saída 2:
fonte
Imprima uma árvore [grande] por linhas.
exemplo de saída:
código:
PS Esta resposta não se concentra exatamente em árvores "binárias" - em vez disso, imprime todos os tipos de árvores. A solução é inspirada no comando "tree" no linux.
fonte
children.get(children.size() - 1)
se o HashMap fosse usado para crianças? Consegui modificar todas as outras partes, menos esta.HashMap<String, List<String>>
?HashMap<String, Node>
. String é o ID do nó.Eu criei um algoritmo aprimorado para isso, que lida bem com nós com tamanhos diferentes. Imprime de cima para baixo usando linhas.
Para usar isso na sua Árvore, deixe sua
Node
classe implementarPrintableNode
.Exemplo de saída:
fonte
???????????
vez das linhas entre nós, mas deve ser apenas um problema de coisas UTF8 e coisas. Enfim, ótimas coisas, tenho que dizer. Melhor resposta para mim, pois é realmente fácil de usar.public static <T> void print(T[] elems)
irá imprimir:
para a entrada
8 4 12 2 6 10 14 1 3 5 7 9 11 13 20 15
esta é uma variante da resposta de @ anurag - estava me incomodando ver os extras | s
fonte
Adaptado de Vasya Novikov 's resposta para torná-lo mais binário , e usar um
StringBuilder
para a eficiência (concatenarString
objetos juntos em Java é geralmente ineficiente).Resultado:
fonte
right != null
.Eu fiz a edição e o testei, funciona bem.michal.kreuzman agradável eu vou ter que dizer.
Eu estava com preguiça de fazer um programa sozinho e pesquisar por código na net quando achei isso realmente me ajudou.
Mas tenho medo de ver que ele funciona apenas para dígitos únicos, como se você usasse mais de um dígito, uma vez que você está usando espaços e não tabulações, a estrutura será perdida e o programa perderá seu uso.
Quanto aos meus códigos posteriores, eu precisava de algumas entradas maiores (pelo menos mais de 10), isso não funcionou para mim e, depois de pesquisar muito na net quando não encontrei nada, eu mesmo fiz um programa.
Ele tem alguns bugs agora, novamente, agora estou com preguiça de corrigi-los, mas imprime muito bem e os nós podem ter qualquer valor grande.
A árvore não será como a pergunta menciona, mas é girada em 270 graus :)
Coloque essa função com seu próprio TreeNode especificado e mantenha o nível inicialmente 0, e divirta-se!
Aqui estão algumas das saídas de amostra:
O único problema é com os ramos que se estendem; Vou tentar resolver o problema o mais rápido possível, mas até então você pode usá-lo também.
fonte
Sua árvore precisará do dobro da distância para cada camada:
Você pode salvar sua árvore em uma matriz de matrizes, uma matriz para cada profundidade:
Se sua árvore não estiver cheia, você precisará incluir valores vazios nessa matriz:
Em seguida, você pode percorrer a matriz para imprimir sua árvore, imprimindo espaços antes do primeiro elemento e entre os elementos, dependendo da profundidade e imprimindo as linhas, dependendo se os elementos correspondentes na matriz para a próxima camada estão preenchidos ou não. Se seus valores puderem ter mais de um caractere, você precisará encontrar o valor mais longo ao criar a representação da matriz e multiplicar todas as larguras e o número de linhas de acordo.
fonte
Achei a resposta de VasyaNovikov muito útil para imprimir uma grande árvore geral e a modifiquei para uma árvore binária
Código:
Saída de amostra:
fonte
Uma solução na linguagem Scala , análoga ao que escrevi em java :
Exemplo de saída:
fonte
Eu sei que todos vocês têm uma ótima solução; Eu só quero compartilhar o meu - talvez esse não seja o melhor caminho, mas seja perfeito para mim!
Com
python
e assim porpip
diante, é realmente muito simples! ESTRONDO!No Mac ou Ubuntu (o meu é mac)
$ pip install drawtree
$python
, entre no console python; você pode fazer isso de outra maneirafrom drawtree import draw_level_order
draw_level_order('{2,1,3,0,7,9,1,2,#,1,0,#,#,8,8,#,#,#,#,7}')
FEITO!
Rastreamento de origem:
Antes de ver este post, fui ao google "texto simples de árvore binária"
E encontrei este https://www.reddit.com/r/learnpython/comments/3naiq8/draw_binary_tree_in_plain_text/ , direcione-me para este https://github.com/msbanik/drawtree
fonte
java
ele espera uma resposta Java :)fonte
Esta é uma solução muito simples para imprimir uma árvore. Não é tão bonito, mas é realmente simples:
Saída de amostra:
fonte
Com base na resposta VasyaNovikov. Melhorado com alguma mágica Java: interface genérica e funcional.
Exemplo de chamada inicial:
Produzirá algo como
fonte
Eu escrevi uma impressora de árvore binária em Java.
O código está no GitHub aqui .
Ele não foi otimizado para a eficiência do tempo de execução, mas como estamos falando de impressão em ASCII, achei que não seria usado em árvores muito grandes. Ele tem alguns recursos interessantes.
Alguns programas de demonstração / teste estão incluídos.
A seguir, é apresentado um exemplo de uma árvore binária gerada aleatoriamente, impressa pelo programa. Isso ilustra o uso eficiente do espaço, com uma grande subárvore direita estendendo-se sob uma pequena subárvore esquerda:
Um exemplo de impressão de todas as cinco árvores binárias de nós (com etiquetas em ordem) na página:
A seguir, é apresentado um exemplo da mesma árvore impressa de quatro maneiras diferentes, com espaçamento horizontal de 1 e de 3 e com ramificações diagonais e horizontais.
fonte
@Makyen
um comentário.Essa é uma pergunta interessante, e eu também escrevi um projeto para ela.
impressora de árvore binária
aqui estão alguns exemplos:
Imprima BST aleatório.
Árvore de impressão a partir da matriz de pedidos no nível de código de estilo leetcode, '#' significa um terminador de caminho em que nenhum nó existe abaixo.
fonte
Eu precisava imprimir uma árvore binária em um dos meus projetos, pois para isso eu preparei uma classe java
TreePrinter
, uma das saídas de exemplo é:Aqui está o código da classe
TreePrinter
junto com a classeTextNode
. Para imprimir qualquer árvore, basta criar uma árvore equivalente àTextNode
classe.Finalmente, aqui está uma classe de teste para imprimir uma amostra:
fonte
Você pode usar um applet para visualizar isso com muita facilidade. Você precisa imprimir os seguintes itens.
Imprimir os nós como círculos com algum raio visível
Obtenha as coordenadas para cada nó.
A coordenada x pode ser visualizada como o número de nós visitados antes que o nó seja visitado em sua travessia de ordem de entrada.
A coordenada y pode ser visualizada como a profundidade do nó específico.
Imprimir as linhas entre pai e filho
Isso pode ser feito mantendo as coordenadas xey dos nós e os pais de cada nó em listas separadas.
Para cada nó, exceto raiz, junte-se a cada nó com seu pai, utilizando as coordenadas xey do filho e do pai.
fonte
https://github.com/murtraja/java-binary-tree-printer
só funciona para números inteiros de 1 a 2 dígitos (eu estava com preguiça de torná-lo genérico)
fonte
Esta foi a solução mais simples para visualização horizontal. Tentei com vários exemplos. Funciona bem para o meu propósito. Atualizado a partir da resposta de @ nitin-k.
Ligar:
Solução:
fonte
node_length * nodes_count + space_length * spaces_count*
.Código no GitHub: YoussefRaafatNasry / bst-ascii-visualization
fonte
visualize
função, é toda avisualizer
classe que tem cerca de 200 loc, incluindo o arquivo de cabeçalho.Para quem procura a solução Rust:
A saída é algo como isto:
fonte
Imprimir no console:
Código simples:
fonte
Aqui está uma impressora em árvore muito versátil. Não é o mais bonito, mas lida com muitos casos. Sinta-se livre para adicionar barras se você puder descobrir isso.
Classe NodeInfo
Classe NodePosition
E, finalmente, Interface do Nó
fonte
Uma solução Scala, adaptada da resposta de Vasya Novikov e especializada em árvores binárias:
fonte
Veja também estas respostas .
Em particular, não foi muito difícil usar o abego TreeLayout para produzir resultados mostrados abaixo com as configurações padrão.
Se você tentar essa ferramenta, observe esta ressalva: Ela imprime crianças na ordem em que foram adicionadas. Para um BST em que a esquerda vs a direita são importantes, achei esta biblioteca inadequada sem modificação.
Além disso, o método para adicionar as crianças simplesmente leva um
parent
echild
nó como parâmetros. (Portanto, para processar vários nós, você deve levar o primeiro separadamente para criar uma raiz.)Acabei usando esta solução acima, modificando-a para receber o tipo
<Node>
para ter acesso àNode
esquerda e à direita (filhos).fonte
Aqui está outra maneira de visualizar sua árvore: salve os nós como um arquivo xml e deixe o navegador mostrar a hierarquia:
Aqui está o código para testá-lo:
E a saída é assim:
fonte
fonte
esta é uma das versões mais simples que eu poderia implementar. espero que ajude você
fonte