Простой код для префиксного обхода дерева.
public static class Treenumerable { public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> childrenSelector) { return source.SelectMany(e => Traverse(e, childrenSelector)); } public static IEnumerable<T> Traverse<T>(T item, Func<T, IEnumerable<T>> childrenSelector) { yield return item; foreach (var subItem in childrenSelector(item).Traverse(childrenSelector)) { yield return subItem; } } }