Eu tenho tentado encontrar um algoritmo para listar todas as árvores binárias de uma determinada altura .
Observe que não estou tentando contá-las: o número dessas árvores é fornecido no OEIS ( A001699 ).
Todos os algoritmos que eu pude ver listam todas as árvores binárias para um determinado número de nós. Uma maneira muito ineficiente de resolver o problema seria verificar todas as árvores com um número de nós entre e , mas isso não é nada bom.
Qualquer ponteiro ou referência seria muito apreciado.
algorithms
binary-trees
enumeration
Shiwen Yao
fonte
fonte
Respostas:
Como sugerido nos comentários, basta seguir a estrutura recursiva das árvores binárias.
Criamos uma função
listbt(h)
que lista todas as árvores binárias exatamente da alturah
.A correção segue com uma prova indutiva elementar
h
.Se você memorizar os resultados de
listbt
serão tão eficientes quanto possível; o grande número de árvores e, assim, o número de verificaçõest != T
dominam.Observe que, se você empregar o compartilhamento de termos (ou seja, apenas vincular
t
e inserirT
,Node(t, T)
mas não copiá-los), poderá reduzir significativamente o tamanho da saída. Isso só faz sentido se suaBTree
implementação for imutável.fonte
Meu primeiro pensamento foi que isso envolve apenas árvores construídas a partir de caminhos de comprimento h, que são números inteiros isomórficos a h-bit, mas esses são apenas um subconjunto do que é necessário. No entanto, começando com tudo o que é necessário, é preencher cada nó intermediário não cheio com árvores que não atingem todo o caminho até o nível da folha.
Ou seja: Enumere o22h- 1 conjuntos não vazios de números inteiros de h e convertê-los em árvores. Em seguida, para cada árvore T, para cada nó não-folha não cheio N (ou seja, ter apenas um filho, já que por definição já está no caminho de pelo menos uma folha), anexe todas as subárvores possíveis que não atinjam o nível da folha (altura <altura (N) -1, incluindo a árvore vazia). Em seguida, imprima o produto cartesiano em todos os N's em T.
Minha afirmação é que isso gera todas as árvores e não gera duas vezes, uma vez que a condição de não atingir o nível da folha torna impossível iniciar com um T e convertê-lo em outro T 'com uma folha diferente de profundidade h.
fonte