Я ищу наиболее эффективный алгоритм, чтобы взять дерево (хранится как список ребер; ИЛИ как список отображений из родительского узла в список дочерних узлов); и создайте для КАЖДОГО узла список всех узлов, произошедших от него (конечный уровень и не конечный уровень).
Реализация должна быть с помощью циклов вместо повторения, из-за масштаба; и в идеале должно быть O (N).
Этот вопрос SO охватывает стандартное достаточно очевидное решение для поиска ответа для ОДНОГО узла в дереве. Но, очевидно, повторение этого алгоритма на каждом узле дерева крайне неэффективно (от вершины моей головы, от O (NlogN) до O (N ^ 2)).
Корень дерева известен. Дерево имеет абсолютно произвольную форму (например, не является N-ным, не сбалансировано каким-либо образом, имеет форму или форму, не имеет одинаковой глубины) - в некоторых узлах есть 1-2 дочерних элемента, в некоторых - 30 тыс. Дочерних элементов
На практическом уровне (хотя это не должно влиять на алгоритм) дерево имеет ~ 100K-200K узлов.