Sto cercando l'algoritmo più efficiente per prendere un albero (memorizzato come un elenco di spigoli; O come un elenco di mappature dal nodo padre a un elenco di nodi figlio); e produrre, 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é recusion, a causa della scala; e dovrebbe idealmente essere O (N).
Questa domanda SO copre una soluzione ragionevolmente ovvia standard per trovare la risposta per UN nodo in un albero. Ma ovviamente, ripetere questo algoritmo su ogni nodo dell'albero è altamente inefficiente (dalla parte superiore della mia testa, da O (NlogN) a O (N ^ 2)).
La radice dell'albero è nota. L'albero ha una forma assolutamente arbitraria (ad es. Non N-nary, non bilanciato in alcun modo, forma o forma, profondità non uniforme) - alcuni nodi hanno 1-2 bambini, altri 30K bambini.
A livello pratico (anche se non dovrebbe influire sull'algoritmo) l'albero ha nodi ~ 100K-200K.