Простой код для префиксного обхода дерева.
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;
}
}
}
