Enumerare i nodi di un albero binario (è per semplicità di esposizione anche se l'algoritmo si adatta anche nel caso di alberi non binari) per livelli è relativamente semplice: basta utilizzare una coda.
Visitare un albero per livelli significa per un albero del tipo

A
   B
     D
     E
   C
     F

la sequenza A B C D E F (prendo, da sinistra a destra, tutti i nodi di livello 0, poi di livello 1, ...).

public class Tree<T>
{
  
public T Item;
  
public Tree<T> Left;
  
public Tree<T> Right;

   public Tree() { }

   public Tree(T item, Tree<T> left, Tree<T> right)
  
{
     
this.Item = item;
     
this.Left = left;
     
this.Right = right;
  
}

   public IEnumerable<T> LevelVisit()
  
{
     
Queue<Tree<T>> queue = new Queue<Tree<T>>();
     
queue.Enqueue(this);
 
     
while (queue.Count > 0)
     
{
        
Tree<T> node = queue.Dequeue();
        
yield return node.Item;

         if (node.Left != null)
           
queue.Enqueue(node.Left);

         if (node.Right != null)
           
queue.Enqueue(node.Right);
     
}
  
}
}