Простой код для префиксного обхода дерева.

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;
        }
    }
}

Теги : Linq, .NET