Estou procurando o algoritmo mais eficiente para pegar uma árvore (armazenada como uma lista de arestas; OU como uma lista de mapeamentos do nó pai para uma lista de nós filhos); e produza, para TODOS os nós, uma lista de todos os nós dele descendentes (nível de folha e nível não-folha).
A implementação deve ser via loops, em vez de recusão, devido à escala; e idealmente deve ser O (N).
Essa pergunta do SO cobre uma solução padrão razoavelmente óbvia para encontrar a resposta para UM nó em uma árvore. Mas, obviamente, repetir esse algoritmo em todos os nós das árvores é altamente ineficiente (em primeiro lugar, O (NlogN) a O (N ^ 2)).
A raiz da árvore é conhecida. A árvore tem uma forma absolutamente arbitrária (por exemplo, não é N-nária, não é equilibrada de forma alguma, forma ou forma, não possui profundidade uniforme) - alguns nós têm 1-2 filhos, outros 30K filhos.
Em um nível prático (embora não deva afetar o algoritmo), a árvore possui ~ 100K-200K nós.