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