Ti consiglio di seguire l'esempio che ti vado a scrivere:
Supponi di avere il seguente albero come istanza
codice:
                  a
        -------|--------
        |                   |
        b                   c
     --|--              --|--
    |      |             |     |
   d       e            f      g
quindi ha 3 livelli.
Suppongo che l'interfaccia della struttura dati presenti due operatori
sin(node) e des(node) che hanno la funzione di restituire rispettivamento il figlio sinistro e quello destro di node, ma questo non è una questione centrale.

Fissando che ti avvali di una struttura lineare di appoggio P e di una variabile k che indica il livello corrente di scansione, allora dovresti considerare i seguenti passi:
codice:
T; //istanza di albero bin
P; //istanziato e inizialmente vuoto
k = 1;
n = 0; //conta nodi
P.ins(a);

passi eseguiti finchè P non è vuoto..

   estrai e rimuovi il primo nodo aggiunto;
   n = n + 1;
   P.ins( T.sin(a) ); P.ins( T.des(a) );
   => P[b, c]

   estrai e rimuovi il primo nodo aggiunto;
   n = n + 1;
   n == 2^k { 
         a questo livello k, ci sono esattamente |P|+1 nodi;
         k = k + 1;
   }
   P.ins( T.sin(b) ); P.ins( T.des(b) );
   => P[c, d, e]

   estrai e rimuovi il primo nodo aggiunto;
   n = n + 1;             
   P.ins( T.sin(c) ); P.ins( T.des(c) );
   => P[d, e, f, g]

   estrai e rimuovi il primo nodo aggiunto;
   n = n + 1;
   n == 2^k { 
         a questo livello k, ci sono esattamente |P|+1 nodi;
         k = k + 1;
   }
   P.ins( T.sin(d) ); P.ins( T.des(d) ); //non inserisci in quanto nulli
   => P[e, f, g] 

   ...per il livello 3 nulla verrà notificato in quanto la procedurà stopperà
   esattamente per n = 7.
Tieni presente che un albero binario al k-esimo livello dovrebbe avere 2^k nodi, da questo calcolo esce fuori il mio algoritmo.
Adesso sta a te trovare la giusta implementazione, anche se il tuo dato astratto albero utilizza un metodo alternativo agli operatori sin e des.