Nel seguito svolgeremo alcuni esercizi sugli alberi in 5 passi:
{AI: t e' inizializzato e "contiene" l'albero T} {AF: t "contiene" l'albero speculare di T} procedure r (var t:tree);
r([]) = [] r([n,L,R]) = [n,r(R),r(L)]
procedure r (var t:tree); begin if t<>nil then begin --SCAMBIA t^.left E t^.right r(t^.left); r(t^.right); end; end;
Si osservi che, data la particolare implementazione della struttura dati albero binario contenuta nella UNIT "alberi", il parametro della procedura puo' essere passato per valore (SI NOTI CHE passare il parametro per valore limita la nostra liberta' nel cambiare l'implementazione della struttura dati in future versioni della procedura che mantengano la stessa intestazione; PERCHE?).
{AI: t e' inizializzato e "contiene" l'albero T} {AF: t "contiene" l'albero speculare di T} procedure r (t:tree); {SPECIFICA DELL'ALGORITMO: r([]) = [] r([n,L,R]) = [n,r(R),r(L)] } var temp:tree; begin if t<>nil then begin temp:=t^.left; t^.left:=t^.right; t^.right:=temp; r(t^.left); r(t^.right); end; end;
La procedura e' gia' scritta nella forma adatta per appicare l'elinazione della ricorsione di coda come descritta nei lucidi presentati a lezione dal docente di Programmazione II.
{AI: t e' inizializzato e "contiene" l'albero T} {AF: t "contiene" l'albero speculare di T} procedure r (t:tree); {SPECIFICA DELL'ALGORITMO: r([]) = [] r([n,L,R]) = [n,r(R),r(L)] NOTA: e' stata eliminata la ricorsione di coda } var temp:tree; begin while t<>nil do begin temp:=t^.left; t^.left:=t^.right; t^.right:=temp; r(t^.left); t:=t^.right; end; end;
{AI: e e' inizializzato} {AF: l'operazione "v" e' stata applicata ad e} procedure v (var e:elemtype);
{AI: t e' inizializzato e "contiene" l'albero T, l>=0} {AF: t "contiene" l'albero ottenuto applicando v a tuttil i nodi di T di livello l} procedure a (t:tree, l:integer);
a([],l) = [] a([n,L,R],0) = [v(n),L,R] a([n,L,R],l) = [n,a(L,l-1),a(R,l-1)], dove l>0
Passiamo immediatatamente alla fase successiva
procedure a (t:tree,l:integer); begin if t<>nil then if l=0 then v(t^.elem) else begin a(t^.left,l-1); a(t^.right,l-1); end; end;
La procedura e' gia' scritta nella forma adatta per applicare l'eliminazione della ricorsione di coda come descritta nei lucidi presentati a lezione dal docente di Programmazione II. Il programma risultante e' il seguente:
procedure a (t:tree,l:integer); begin while t<>nil do if l=0 then v(t^.elem) else begin a(t^.left,l-1); t:=t^.right; l:=l-1; end; end;
Esercizi Realizzare una procedura che soddisfi la seguente specifica: {AI: t e' inizializzato e "contiene" l'albero T, l1,l2>=0} {AF: t "contiene" l'albero ottenuto applicando v a tuttil i nodi di T di livello l compreso tra l1 e l2 (l2>=l>=l1)} procedure a (t:tree, l1,l2:integer);