Estoy buscando el algoritmo más eficiente para tomar un árbol (almacenado como una lista de bordes; O como una lista de asignaciones del nodo principal a una lista de nodos secundarios); y produce, para CADA nodo, una lista de todos los nodos que descienden de él (nivel hoja y nivel no hoja).
La implementación debe ser a través de bucles en lugar de recusión, debido a la escala; e idealmente debería ser O (N).
Esta pregunta SO cubre una solución estándar razonablemente obvia para encontrar la respuesta para UN nodo en un árbol. Pero obviamente, repetir ese algoritmo en cada nodo del árbol es altamente ineficiente (fuera de mi cabeza, O (NlogN) a O (N ^ 2)).
La raíz del árbol es conocida. El árbol tiene una forma absolutamente arbitraria (por ejemplo, no N-nary, no está equilibrado de ninguna manera, forma o forma, no tiene una profundidad uniforme): algunos nodos tienen 1-2 hijos, algunos tienen 30K hijos.
En un nivel práctico (aunque no debería afectar el algoritmo) el árbol tiene ~ 100K-200K nodos.