Inspirado por uma pergunta recente sobre SO ...
Escreva uma função para imprimir uma árvore binária no seguinte formato:
3
/ \
1 5
\ / \
2 4 6
- A saída deve consistir em uma linha de nós, seguida por uma linha de
/
e\
caracteres indicando relacionamentos, seguida por uma linha de nós, etc. - Você pode assumir que todos os nós são representáveis como um único caractere.
- Os nós adjacentes no nível mais baixo devem ser separados por pelo menos um espaço, os nós mais acima devem ser separados conforme apropriado.
- Nós com dois filhos devem ser colocados precisamente no meio de seus filhos diretos.
- As barras de relacionamento devem estar na metade do caminho entre o pai e o filho apropriado (arredondar da maneira que desejar).
Entrada:
A entrada será fornecida como argumento para sua função. Não especificarei a estrutura exata da árvore, no entanto, ela deve ser utilizável como uma árvore binária real. Nenhuma "árvore é representada no meu programa como seqüências coincidindo com a saída esperada".
Você pode imprimir em um fluxo de saída ou retornar uma sequência que contenha a saída, sua escolha.
Aponta para o código mais curto, mas eu prefiro uma solução longa que funcione totalmente do que uma solução curta que funciona 90%.
Atualização para a recompensa:
Para a recompensa, eu (Otimizador) estou fazendo pequenas alterações:
- A entrada pode ser de STDIN, ARGV ou argumento de função.
- A saída precisa estar no STDOUT (ou
console.log
no JS) - Você pode assumir que a entrada está em uma forma de matriz, por exemplo.
[1,2,3]
ou[1 2 3]
Atualização 2 - A árvore binária deve realmente ser uma árvore de pesquisa binária. Como não mencionei isso inicialmente, permitirei que os usuários tratem a conversão de uma matriz normal em uma matriz de árvore de pesquisa binária como um programa separado e a contagem final de bytes será apenas para o programa receber a matriz como argumento e imprimi-la como uma árvore binária.
fonte
30000,1000,499999
Respostas:
Fortran 77-1085 caracteres
A árvore é representada na matriz de entrada
t
da maneira usual, raiz em 1, raiz-> esquerda em 2, raiz-> direita em 3 raiz-> esquerda-> esquerda em 4 ...A saída deve caber em um terminal convencional com até 5 níveis de profundidade.
Eu uso exatamente uma barra entre cada par de nós, que parece bem bobo perto do topo quando existem quatro ou mais níveis. Eu permiti até três nós de dígitos.
Programa completo com comentários e um andaime de lançamento:
Saída com entrada equivalente ao exemplo:
fonte
CJam,
10099 bytesA entrada deve ser uma lista de caracteres, sem nenhum caractere de controle ascii. Nós vazios são indicados por um espaço. Também deve ser uma árvore binária perfeita com exatamente 2 n -1 nós.
Exemplo:
Ou simplesmente use strings:
Resultado:
Explicação
Script de conversão
Aceita caracteres ou números de um dígito.
Exemplos (todos são iguais):
Resultado:
É uma construção de árvore cartesiana direta.
fonte
Python 2, 411 bytes
Nota: O primeiro nível de recuo é de 1 espaço, o segundo é uma guia.
Ligue
f
com uma lista de cadeias de caracteres de um ouNone
mais, por exemplo.f(['1',None,'3'])
. A lista não pode estar vazia.Isso deve obedecer às regras da recompensa.
Script do conversor:
Converte e matriz para o formato usado pela impressora em árvore binária. Exemplo:
-
Exemplos:
Para executá-los, você deve ter o arquivo principal nomeado
bt.py
e o arquivo conversor nomeadoconv.py
.fonte
['1','2','3','4','5','6','7','8','9']
matriz não é o que você mostrou. Deveria ter3
como filho certo o2
qual é filho certo e o1
qual é um elemento raiz.APL, 125 caracteres
Exemplo:
Testado aqui.
fonte
Ruby, 265 bytes
A versão @proudhaskeller, 269 bytes
Explicação
A versão detalhada:
Exemplo
dá:
(Ainda não escrevi o script de conversão.)
fonte