11.07.2015 Views

Esercizi di Algoritmi e Strutture Dati - Moreno Marzolla

Esercizi di Algoritmi e Strutture Dati - Moreno Marzolla

Esercizi di Algoritmi e Strutture Dati - Moreno Marzolla

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

mantenere in modo efficiente il valore corretto <strong>di</strong> v.h per ciascun nodo.Tale mo<strong>di</strong>fica non deve alterare il costo computazionale delle operazioni<strong>di</strong> inserimento e rimozione, che devono mantenersi O(h) nel caso pessimo,essendo h l’altezza totale dell’albero.2. Consderiamo ancora un generico ABR. Dimostrare come l’operazione <strong>di</strong>rotazione semplice può essere estesa per mantenere il valore corretto <strong>di</strong> v.hper ciascun nodo. Dopo tale mo<strong>di</strong>fica, il costo dell’operazione <strong>di</strong> rotazionesemplice deve essere O(h) nel caso pessimo, essendo h l’altezza totaledell’albero.3. Usare i due punti precedenti per <strong>di</strong>mostrare come sia possibile mantenerel’informazione sull’altezza <strong>di</strong> ciascun sottoalbero in un albero AVL senzaalterare il costo computazionale delle operazioni <strong>di</strong> inserimento e rimozione<strong>di</strong> no<strong>di</strong>.SoluzioneAssumiamo che un oggetto nodo v abbia gli attributi seguenti:v.left riferimento al figlio sinistro (oppure null);v.right riferimento al figlio destro (oppure null);v.parent riferimento al padre (oppure null se v è la ra<strong>di</strong>ce);v.h altezza dell’albero ra<strong>di</strong>cato in v.Definiamo come prima cosa l’algoritmo aggiusta_h(v). L’algoritmo funzionacome segue: assume che i figli del nodo v (se esistono) abbiano il valorecorretto dell’attributo h (quin<strong>di</strong>, assume <strong>di</strong> conoscere in maniera esatta l’altezzadei sottoalberi ra<strong>di</strong>cati nei figli, sempre se non sono vuoti). In base a questainformazione, calcola il valore <strong>di</strong> v.h.algoritmo aggiusta_h(Nodo v)if ( v.left == null && v.right == null ) thenv.h = 0;elseif( v.left == null ) then // v.right != nullv.h = v.right.h + 1;elseif( v.right == null ) then // v.left != nullv.h = v.left.h + 1;elsev.h = max( v.left.h, v.right.h ) + 1;en<strong>di</strong>fA questo punto è facile definire un’altra procedura, che chiameremo aggiusta_h_ricche risale ricorsivamente da un nodo v fino alla ra<strong>di</strong>ce dell’albero, ricalcolandoil valore dell’attributo h <strong>di</strong> tutti i no<strong>di</strong> visitati:4

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!