Originariamente inviato da Shores

Tra l'algoritmo proposto da anx721 è inutilmente pesante, poichè procede nell'analisi di TUTTO l'albero anche quando il livello richiesto è stato superato; sarebbe stato più giusto attivare la ricorsione SOLO se il livello attuale era MINORE di quello cercato.

Infatti, i figli di un nodo di livello J non potranno che avere livello J+1; ciò implica che se ho trovato un nodo del livello cercato i suoi figli (e i suoi nipoti e così via) saranno di certo ignorabili poichè aventi livelli di certo superiori.
Infatti se leggi bene il mio algoritmo, corredato di commenti, c'è scritto:

codice:
    if(curentLevel == level){
         printf("%d\n", T -> elem);
         //Se questo nodo è a livello level non c'è bisogno di
         //richiamare la procedura sui figli che saranno a
         //livello magiore
         return;
    }
    printLevel(T -> left, currentLevel + 1, level);
    printLevel(T -> right, currentLevel + 1, level);
da cui si vede che quando si raggiunge il livello k desiderato si stampa il nodo e poi c'è return cosicchè le chiamate ricorsive non vengono eseguite sui nodi a livello maggiore :quote:

La complessita è ovviamente lineare rispetto al numero dei nodi (nel caso peggiore infatti k è pari all'altezza dell'albero quindi bisogna visitare tutti i nodi); come impostare le equazioni di ricorrenza ora non mi ricordo.



PS x }gu|do[z]{®©: poi vedo