Два других решения являются типичными рекурсивными решениями этой проблемы и подходят для мелких графов без циклов.Если у вас есть глубокий график с циклами, они не будут работать хорошо.Вам будет лучше с чем-то вроде этого:
public static IEnumerable<T> DepthFirstTraversal<T>(
T root,
Func<T, IEnumerable<T>> children)
{
var set = new HashSet<T>();
var stack = new Stack<T>();
stack.Push(root);
while(stack.Count != 0)
{
T current = stack.Pop();
if (set.Contains(current)) continue;
yield return current;
set.Add(current);
foreach(var child in children(current))
stack.Push(child);
}
}
, а затем вызывать его с
foreach(var d in DepthFirstTraversal(root, x=>x.Directories))
...
. Набор отслеживает уже посещенные узлы и поэтому занимает O (n) пространство.Нет рекурсии, поэтому это O (1) в пространстве стека.
Если вы знаете, что циклов нет, вы можете исключить набор и сэкономить на этой стоимости.