Algoritmi e Strutture Dati I
Terzo Appello -- 8 Giugno 1999
function F ( T: AlberoBinario ) : integer;
begin
if (T = NIL)
then F := 1
else F := Chiave(T) * F( FiglioSinistro(T) )
+ F( FiglioDestro(T) ) * F( FiglioDestro(T) )
end;
Esercizio 2. (7 punti) Scrivere una funzione Pascal che, data una lista di interi, ne produca in uscita una copia. Si adotti la seguente definizione di lista:
type LISTA = ^Nodo;
Nodo = record
elem : Integer ;
next : LISTA
end;
Si vuole realizzare tale tipo di dato mediante le seguenti quattro strutture dati:
Riempire la seguente tabella con la complessità asintotica delle operazioni suddette realizzate con le quattro strutture dati:
| FIND-MIN | EXTRACT-MIN | INSERT | |
| ALBERO AVL | |||
| HEAP | |||
| LISTA BIDIREZIONALE | |||
| VETTORE ORDINATO |
Esercizio 4. (8 punti)
Dato un grafo non orientato rappresentato con liste di
adiacenza, si deve verificare se è un albero.
Soluzione dell'esercizio 1.
else F := Chiave(T) * F( FiglioSinistro(T) )
+ F( FiglioDestro(T) ) * F( FiglioDestro(T) )
con le seguenti istruzioni (e dopo aver dichiarato la variabile
intera X)
else begin
X := F( FiglioDestro(T) );
F := Chiave(T) * F( FiglioSinistro(T) ) + X * X
end
Di conseguenza, l'equazione di ricorrenza diventa
la cui soluzione èSoluzione dell'esercizio 2.
function COPIA ( L : LISTA ) : LISTA;
var P : LISTA;
begin
if (L = NIL) then COPIA := NIL
else begin
new(P);
P^.elem := L^.elem;
P^.next := COPIA( L^.next );
COPIA := P
end
end;
Soluzione dell'esercizio 3.
| FIND-MIN | EXTRACT-MIN | INSERT | |
| ALBERO AVL | |||
| HEAP | |||
| LISTA BIDIREZIONALE | |||
| VETTORE ORDINATO |
Soluzione dell'esercizio 4.
IsAlbero( G ) // G = grafo non vuoto 1. foreach u in V do colore[u] := bianco 2. DFS-VISIT( u ) // u = vertice arbitrario 3. connesso := true; NumArchi := NumVertici := 0 4. foreach u in V do 5. connesso := connesso and (colore[u] = nero) 6. NumVertici := NumVertici + 1 7. NumArchi := NumArchi + Dim( ListaAdiacenza(u) ) 8. NumArchi := NumArchi / 2 9. return ( connesso and (NumArchi = NumVertici-1) )