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.