Sto cercando l'algoritmo più efficiente per prendere un albero (memorizzato come una lista di spigoli, OPPURE come elenco di mappature dal nodo genitore a un elenco di nodi figli); e produce, per OGNI nodo, un elenco di tutti i nodi discendenti da esso (livello foglia e livello non foglia).
L'implementazione deve avvenire tramite loop anziché ricusazione, a causa della scala; e dovrebbe idealmente essere O (N).
Questa domanda SO copre una soluzione standard ragionevolmente ovvia per trovare la risposta per ONE nodo in un albero. Ma ovviamente, ripetere quell'algoritmo su ogni nodo dell'albero è altamente inefficiente (dalla parte superiore della mia testa, O (NlogN) a O (N ^ 2)).
La radice dell'albero è conosciuta. L'albero ha una forma assolutamente arbitraria (per esempio non N-nary, non è bilanciato in alcun modo, forma o forma, profondità non uniforme) - alcuni nodi hanno 1-2 bambini, alcuni hanno 30K bambini.
A livello pratico (anche se non dovrebbe influenzare l'algoritmo) l'albero ha ~ 100K-200K nodi.