Je recherche l'algorithme le plus efficace pour prendre un arbre (stocké sous forme de liste d'arêtes; OU sous forme de liste de mappages du nœud parent vers une liste de nœuds enfants); et produire, pour CHAQUE nœud, une liste de tous les nœuds qui en sont issus (niveau feuille et niveau non feuille).
La mise en œuvre doit se faire via des boucles au lieu de la récusion, en raison de l'échelle; et devrait idéalement être O (N).
Cette question SO couvre une solution standard assez évidente pour trouver la réponse pour UN nœud dans une arborescence. Mais évidemment, répéter cet algorithme sur chaque nœud d'arbre est très inefficace (du haut de ma tête, O (NlogN) à O (N ^ 2)).
La racine de l'arbre est connue. L'arbre est de forme absolument arbitraire (par exemple pas N-naire, pas équilibré de quelque façon que ce soit, forme ou forme, pas de profondeur uniforme) - certains nœuds ont 1-2 enfants, certains ont 30K enfants.
Sur le plan pratique (bien que cela ne devrait pas affecter l'algorithme), l'arbre a environ 100 000 nœuds.