Sunteți pe pagina 1din 38

8.3.

Arbori binari ordonai


8.3.1. Definiii

Structura de arbore binar poate fi utilizat pentru a reprezenta n mod convenabil o


mulime de elemente, n care elementele se regsesc dup o cheie unic.

Se presupune c avem o mulime de n noduri definite ca articole, fiecare


avnd cte o cheie care este numr ntreg.

Dac cele n articole se organizeaz ntr-o structur de list liniar, cutarea


unei chei necesit n medie n/2 comparaii.

Dup cum se va vedea n continuare, organizarea celor n articole ntr-o


structur convenabil de arbore binar, reduce numrul de cutri la
maximum log2n.

Acest lucru devine posibil utiliznd structura de arbore binar ordonat.

Prin arbore ordonat se nelege un arbore binar care are proprietatea c,


parcurgnd nodurile sale n inordine, secvena cheilor este monoton cresctoare.

Un arbore binar ordonat se bucur de urmtoarea proprietate:


o Dac n este un nod oarecare al arborelui, avnd cheia c, atunci:
Toate nodurile din subarborele stng a lui n au cheile mai mici sau
egale cu c
Toate nodurile din subarborele drept al lui n au chei mai mari sau
egale cu c.

De aici rezult un procedeu foarte simplu de cutare:


o ncepnd cu rdcina, se trece la fiul stng sau la fiul drept, dup cum cheia
cutat este mai mic sau mai mare dect cea a nodului curent.

Numrul comparaiilor de chei efectuate n cadrul acestui procedeu este cel mult
egal cu nlimea arborelui.

Din acest motiv aceti arbori sunt cunoscui i sub denumirea de arbori binari de
cutare (Binary Search Trees).

n general nlimea unui arbore nu este determinat de numrul nodurilor sale.


o Spre exemplu cu cele 9 noduri precizate n fig.8.3.1.a se poate construi att
arborele ordonat (a) de nlime 4 ct i arborele ordonat (b) de nlime 6.

5
8

3
5

(a)

(b)

Fig.8.3.1.a. Arbori binari ordonai de diferite nlimi

Este simplu de observat c un arbore are nlimea minim dac fiecare nivel al su
conine numrul maxim de noduri, cu excepia posibil a ultimului nivel.

Deoarece numrul maxim de noduri al nivelului i este 2i-1, rezult c nlimea


minim a unui arbore binar cu n noduri este:
hmin = log 2 (n + 1)

Prin aceasta se justific i afirmaia c o cutare ntr-un arbore binar ordonat necesit
aproximativ log2n comparaii de chei

o Se precizeaz ns, c aceast afirmaie este valabil n ipoteza c nodurile sau organizat ntr-o structur de arbore binar ordonat de nlime
minim.

Dac aceast condiie nu este satisfcut, eficiena procesului de cutare poate fi


mult redus, n cazul cel mai defavorabil arborele degenernd ntr-o structur de
list liniar.

Aceasta se ntmpl cnd subarborele drept (stng) al tuturor nodurilor este vid, caz
n care nlimea arborelui devine egal cu n, iar cutarea nu este mai eficient dect
cutarea ntr-o list liniar ( O (n/2)).

8.3.2. Tipul de date abstract arbore binar ordonat

ntr-o manier similar celei n care au fost definite tipurile de date abstracte pe
parcursul acestui curs, i n cazul arborilor binari ordonai se poate defini un astfel
de tip.

Acesta presupune desigur:


(1) Definirea modelului matematic asociat
(2) Precizarea setului de operatori.

Ca i pentru celelalte structuri studiate i n acest caz este greu de definit un set de
operatori general valabil.

Din mulimea seturilor posibile se propune setul prezentat n [8.3.2.a].

------------------------------------------------------------TDA Arbore Binar Ordonat (ABO)


Modelul matematic: este un arbore binar, fiecare nod avnd
asociat o cheie specific. Pentru fiecare nod al
arborelui este valabil urmtoarea proprietate: cheia
nodului respectiv este mai mare dect cheia oricrui nod
al subarborelui su stng i mai mic decat cheia
oricrui nod al subarborelui su drept.
Notatii:
TipCheie - tipul cheii asociate structurii nodului
TipElement - tipul asociat structurii unui nod
RefTipNod - referina la un nod al structurii
TipABO - tipul arbore binar ordonat
b: TipABO;
x,k: TipCheie;
e: TipElement;
p: RefTipNod;
[8.3.2.a]
Operatori:
1. Creaza(b: TipABO); - procedur care creaz arborele
binar vid b;
2. Cauta(x: TipCheie, b: TipABO): RefTipNod; - operator
funcie care caut n arborele b un nod avnd cheia
identic cu x returnnd referina la nodul n cauz
respectiv indicatorul vid dac un astfel de nod nu
exist;
3. Actualizeaza(e: TipElement, b: TipABO); - caut nodul
din arborele b care are aceeai cheie cu nodul e i i
modific coninutul memornd pe e n acest nod. Dac
un astfel de nod nu exist, operatorul nu realizeaz
nici o aciune;
4. Insereaza(e: TipElement, b: TipABO); - insereaz
elementul e n arborele b astfel nct acesta s
rmn un ABO;
5. SuprimaMin(b: TipABO, e: TipElement); - extrage nodul
cu cheia minim din arborele cu rdacina b i l
returneaz n e. n urma suprimrii arborele b rmne
un ABO;
6. Suprima(x: TipCheie, b: TipABO); - suprim nodul cu
cheia x din arborele b, astfel nct arborele s
rmn ordonat. Dac nu exist un astfel de nod,
procedura nu realizez nimic.
-------------------------------------------------------------

8.3.3. Tehnici de cutare n arbori binari ordonai

Fie b o referin care indic rdcina unui arbore binar ordonat, ale crui noduri au
structura definit n [8.3.3.a] i

Fie x un numr ntreg dat.


n aceste condiii funcia Cauta(x,b) precizat n secvena [8.3.3.b] execut cutarea
acelui nod aparinnd arborelui b care are cheia egal cu x,

Cutarea se realizeaz n conformitate cu procedeul descris n paragraful anterior.


Funcia Cauta returneaz valoarea NIL dac nu gsete nici un nod cu cheia x,
altminteri valoarea ei este egal cu pointerul care indic acest nod.
------------------------------------------------------------{Structura de date Arbore Binar Ordonat}
TYPE RefTipNod=^TipNod;
TipNod=RECORD
cheie: TipCheie;
[8.3.3.a]
stang,drept: RefTipNod;
END;
------------------------------------------------------------{Cutare n ABO (Varianta iterativ)}
FUNCTION Cauta(x:TipCheie; VAR b:TipABO):RefTipNod;
VAR gasit:boolean;
BEGIN
gasit:=false;
WHILE(b<>NIL) AND NOT gasit DO
[8.3.3.b]
BEGIN
IF b^.cheie=x THEN gasit:=true ELSE
IF x<b^.cheie THEN b:=b^.stang ELSE
b:=b^.drept
END;
Cauta:=b
END; {Cauta}
-------------------------------------------------------------

Acelai proces de cutare poate fi implementat i n variant recursiv innd cont de


faptul ca arborele binar este definit ca i o structur de date recursiv.

Varianta recursiv a cutrii apare n secvena [8.3.3.c].


Se face ns precizarea c aceast implementare este mai puin performant
deoarece principial cutarea n arborii binari ordonai este o operaie pur
secvenial care nu necesit memorarea drumului parcurs.
------------------------------------------------------------{Cutare n ABO (Varianta recursiv)}
FUNCTION CautaRecursiv(x:TipCheie; b:TipABO):RefTipNod;
BEGIN
IF b=NIL THEN
CautaRecursiv:=b

ELSE
IF x<b^.cheie THEN
b:=CautaRecursiv(x,b^.stang)
[8.3.3.c]
ELSE
IF x>b.cheie THEN
b:=CautaRecursiv(x,b^.drept)
ELSE
CautaRecursiv:=b
END; {CautaRecursiv}
------------------------------------------------------------8.3.4. Inseria nodurilor n ABO. Crearea arborilor binari ordonai

n cadrul acestui paragraf se trateaz:


(1) Inseria nodurilor ntr-un arbore binar ordonat
(2) Problema construciei unui arbore binar ordonat, pornind de la o mulime
dat de noduri.

Procesul de creare al unui ABO const n inseria cte unui nod ntr-un arbore binar
ordonat care iniial este vid.

Problema care se pune este aceea de a executa inseria de o asemenea manier


nct arborele s rmn ordonat i dup adugarea noului nod.

Acesta se realizeaz traversnd arborele ncepnd cu rdcina i selectnd fiul


stng sau fiul drept, dup cum cheia de inserat este mai mic sau mai mare
dect cheia nodului parcurs.

Aceasta proces se repet pn cnd se ajunge la un pointer NIL.


n continuare inseria se realizeaz modificnd acest pointer astfel nct s indice
noul nod.

Se precizeaz c inseria noului nod trebuie realizat chiar dac arborele conine deja un
nod cu cheia egal cu cea nou.

n acest caz, dac se ajunge la un nod cu cheia egal cu cea de inserat, se


procedeaz ca i cum aceasta din urm ar fi mai mare, deci se trece la fiul drept
al nodului curent.

n felul acesta la parcurgerea n inordine a arborelui binar ordonat se obine o


metod de sortare stabil (Vol.1 &3.1).

n fig.8.3.4.a se prezint inseria unei noi chei cu numrul 8 n structura existent de


arbore ordonat.

La parcurgerea n inordine a acestui arbore, se observ c cele dou chei egale sunt
parcurse n ordinea n care au fost inserate.

Fig.8.3.4.a. Inseria unui nod nou cu o cheie existent

n continuare se prezint o procedur recursiv pentru inseria unui nod ntr-un arbore
binar ordonat, astfel nct acesta s rmn ordonat.

Se precizeaz c iniial, arborele poate fi vid.


Structura de arbore la care se vor face referiri este cea precizat n secvena [8.3.3.a].
Procedura Insereaza1 realizeaz inseria unui nod cu cheia x ntr-un arbore binar
ordonat [8.3.4.a].

Se precizeaz c x este un numr ntreg reprezentnd cheia nodului de inserat i


b un pointer care indic rdcina arborelui
------------------------------------------------------------{Inseria unui nod ntr-un arbore binar ordonat (Varianta 1)}
PROCEDURE Insereaza1(x:TipCheie; VAR b:TipABO);
BEGIN
IF b<> NIL THEN
IF x<b^.cheie THEN
Insereaza(x,b^.stang)
ELSE
Insereaza(x,b^.drept)
[8.3.4.a]
ELSE {b este NIL}
BEGIN
new(b); {completarea nlnuirii}
b^.cheie:=x; b^.stang:=NIL; b^.drept:=NIL
END
END; {Insereaza1}
-------------------------------------------------------------

Se observ c pentru funcionarea corect a acestei proceduri este esenial ca b s fie


parametru variabil, deoarece numai astfel noua valoare pe care o primete b prin
instruciunea new(b), se asigneaz i parametrului actual corespunztor.

n secvena [8.3.4.b] se prezint un fragment de program principal care utilizeaz


procedura de mai sus n vederea crerii unui arbore binar ordonat.

Se presupune c:
(1) Toate cheile sunt diferite de zero,
(2) Cheile se citesc de la dispozitivul de intrare
(3) Secvena de chei se ncheie cu o cheie fictiv egal cu zero pe post
de terminator.
------------------------------------------------------------{Construcia unui arbore binar ordonat}
VAR radacina:RefTipNod;
c:TipCheie;
BEGIN
radacina:=NIL;
Read(c);
[8.3.4.b]
WHILE c<>0 DO
BEGIN
Insereaza(c,radacina);
Read(c)
END
END;
------------------------------------------------------------ n continuare se descrie o variant nerecursiv a procedurii Insereaz.

n cadrul acestei variante se disting dou pri i anume:


(1) Parcurgerea arborelui pentru gsirea locului unde trebuie inserat noul
nod

(2) Inseria propriu-zis.


Prima parte se implementeaz cu ajutorul a doi pointeri q1 i q2, urmnd un algoritm
similar celui utilizat la liste (tehnica celor doi pointeri - Vol.1 &6.4.2).

Cei doi pointeri indic mereu dou noduri "consecutive" ale arborelui:

q2^ este nodul curent (iniial rdcina),

q1^ este fiul su stng sau fiul drept, dup cum x, cheia care se caut, este
mai mic respectiv mai mare dect cheia nodului curent indicat de q2.

Pointerii avanseaz din nod n nod de-a lungul arborelui, pn cnd pointerul q1
devine NIL, moment n care se realizeaz inseria propriu-zis.

Se precizeaz c este nevoie i de o variabil ntreag d, pentru a preciza dac


nodul nou trebuie inserat ca fiu stng sau ca fiu drept al lui q2^.

Aceast variabil se asigneaz n timpul parcurgerii arborelui i se testeaz n


cadrul inseriei propriu-zise [Wi76].

Spre deosebire de varianta recursiv n care traseul parcurs este memorat implicit de
ctre mecanismul de implementare al recursivitii cu ajutorul unei stive, n acest caz nu

este nevoie de stiv ntruct nu trebuie s se revin n arbore dect cu un singur nivel
(pentru a realiza nlnuirea), motiv pentru care sunt suficieni doi pointeri consecutivi
(fig.8.3.4.b (b)).
radacina

radacina

(a)

q2

q1

(b)

Fig.8.3.4.b. Arbori binari ordonai. Tehnica celor doi pointeri

Procedura care realizeaz inseria ntr-un arbore binar ordonat n manier nerecursiv
apare n secvena [8.3.4.c].
-----------------------------------------------------------{Inseria n ABO (Varianta nerecursiv)}
PROCEDURE InsereazaNerecursiv(x:TipCheie; b:TipABO);
VAR q1,q2:RefTipNod;
d:integer;
BEGIN
q2:=b;
q1:=q2^.drept;
d:=1;
WHILE q1<>NIL DO
BEGIN
q2:=q1;
IF x<q1^.cheie THEN
BEGIN
q1:=q1^.stang;
d:=-1.
END
ELSE
BEGIN
q1:=q1^.drept;
[8.3.4.c]
d:=1
END
END; { terminare parcurgere}
new(q1); {inserie}
q1^.cheie:=x;
q1^.stang:=NIL;
q1^.drept:=NIL
IF d<0 THEN
{IF (x<q2^cheie) THEN ...}
q2^.stang:=q1

ELSE
q2^.drept:=q1
END; {InsereazaNerecursiv}
-------------------------------------------------------------

Este uor de vzut c aceast procedur funcioneaz corect numai dac arborele are cel
puin un nod.

Din acest motiv n implementarea structurii arborelui se utilizeaz tehnica nodului


fictiv.

Astfel iniial arborele va conine un nod fictiv a crui nlnuire pe dreapta indic primul
nod efectiv al arborelui.

n aceast accepiune arborele binar vid arat ca i n figura 8.3.4.b.(a).


Drept consecin cei doi pointeri vor putea fi poziionai n mod corespunztor chiar i
pentru arborele vid: q2 indic nodul fictiv iar q1 este NIL.

De asemenea se face precizarea c se poate renuna la variabila d.


Faptul c noul nod trebuie inserat ca fiu stng sau ca fiu drept al lui q2 se
stabilete comparnd cheia lui q2 cu cheia de inserat x.

Acest procedeu este sugerat ca i comentariu n secvena [8.3.4.c.]


Cu privire la crearea arborilor binari ordonai se poate meniona faptul c nlimea
arborilor obinui prin procedurile prezentate, depinde de ordinea n care se furnizeaz
iniial cheile.

Dac spre exemplu, secvena cheilor iniiale este 5,3,8,2,4,7,9,1,6


atunci se obine arborele din figura 8.3.1.a stnga, avnd o nlime minim (4)

Dac aceleai chei se furnizeaz n ordinea 7,2,8,1,6,9,3,5,4 atunci


rezult arborele mai puin avantajos din aceeai figura dreapta cu nlimea 6.

5
8

3
5

Fig.8.3.1.a. Arbori binari ordonai de diferite nlimi (reluare)

n cazul cel mai defavorabil, arborele poate degenera n list liniar, lucru care se
ntmpl n cazul n care cheile sunt furnizate n vederea inseriei n secven ordonat
cresctor respectiv descresctor (fig.8.3.4.c.(a),(b)).

(a)

(b)

Fig.8.4.3.c. Arbori binari ordonai degenerai n liste liniare.

Este evident faptul c n astfel de situaii performana cutrii scade catastrofal fiind
practic egal cu cea a cutrii ntr-o list liniar ordonat.

Din fericire, probabilitatea ca s apar astfel de situaii este destul de redus, fenomen ce
va fi analizat mai trziu n cadrul acestui capitol.

8.3.5. Suprimarea nodurilor n arbori binari ordonai

Se consider o structur de arbore binar ordonat i o cheie precizat x.


Se cere s se suprime din structura de arbore nodul avnd cheia x.
Pentru aceasta, n prealabil se caut dac exist un nod cu o astfel de cheie.
Dac nu, suprimarea s-a ncheiat i se emite eventual un mesaj de eroare.
n caz contrar se execut suprimarea propriu-zis, de o asemenea manier nct
arborele s rmn ordonat i dup terminarea ei.

Se disting dou cazuri, dup cum nodul care trebuie suprimat are:
(1) Cel mult un fiu
(2) Doi fii.
(1) Primul caz se rezolv conform figurii 8.3.5 (a,b,c) n care se prezint cele trei
variante posibile.

p
X

(a)

(b)

(c)

Fig.8.3.5.a. Suprimarea unui nod ntr-un ABO. Cazul 1.

Regula general care se aplic n acest caz este urmtoarea:


Fie p cmpul referint aparinnd tatlui nodului x, referin care indic
nodul x.
Valoarea lui p se modific astfel nct acesta s indice unicul fiu al lui x
(dac un astfel de fiu exist - fig. 8.3.5.a (a),(b)) sau n caz contrar p
devine NIL (fig.8.3.5.a (c)).

Fragmentul de cod care apare n continuare ilustreaz acest procedeu [8.3.5.a].


------------------------------------------------------------{Suprimarea unui nod ntr-un ABO. Cazul 1: nodul de suprimat
are un singur sau nici un fiu}
q:=p;
IF q^.drept=NIL THEN
p:=q^.stang
ELSE
[8.3.5.a]
IF q^.stang=NIL THEN
p:=q^.drept;
-------------------------------------------------------------

Ca exemplu, se prezint n continuare implementarea operatorului SuprimaMin care


suprim i n acelai timp returneaz cel mai mic element al unui arbore binar ordonat
(secvena [8.3.5.b]).

Cel mai mic element al unui arbore binar ordonat, este cel mai din stnga nod al
arborelui, nod la care se ajunge naintnd mereu spre stnga pornind de la
rdacin.

Primul nod care nu are nlnuire spre stanga (nu are fiu stng) este nodul cutat.
Suprimarea lui este imediat n baza procedeului precizat mai sus.
-----------------------------------------------------------{Operatorul SuprimaMin n ABO}
PROCEDURE SuprimaMin(VAR b:TipABO; VAR min:TipElement);

VAR temp:RefTipNod;
BEGIN
IF b<>NIL THEN
IF b^.stang<>NIL THEN
SuprimaMin(b^.stang, min)
ELSE
BEGIN
[8.3.5.b]
min:=b^.info; temp:=b;
b:=b^.drept;
{suprimare}
DISPOSE(temp)
END
END; {SuprimaMin}
-------------------------------------------------------------

ntr-o manier similar se poate implementa operatorul SuprimaMax


Acesta realizeaz suprimarea celui mai mare nod al arborelui, care este evident
nodul situat cel mai la dreapta n arbore.

(2) Cel de-al doilea caz, n care nodul cu cheia x are doi fii se rezolv astfel:
1. Se caut predecesorul nodului de suprimat x n ordonarea n inordine a
arborelui.

Fie acesta y. Se demonstreaz c nodul y exist i c el nu are fiu


drept.
2. Se modific nodul x, asignnd toate cmpurile sale, cu excepia cmpurilor
stng i drept cu cmpurile corespunztoare ale lui y.

n acest moment n structura de arbore, nodul y se gsete n


dublu exemplar: n locul su iniial i n locul fostului nod x.
3. Se suprim nodul y iniial, conform fragmentului [8.3.5.a] deoarece nodul nu
are fiu drept.

Cu privire la nodul y, se poate demonstra c el se detecteaz dup urmtoarea metod:


Se construiete o secven de noduri care ncepe cu fiul stng al lui x, dup care
se alege drept succesor al fiecrui nod, fiul su drept

Primul nod al secvenei care nu are fiu drept este y (fig.8.3.5.b).


Este de fapt cel mai mare nod al subarborelui stng al subarborelui
binar care are rdcina x.

Fig. 8.3.5.b. Suprimarea unui nod ntr-un ABO. Cazul 2.

Procedura care realizeaz suprimarea unui nod ntr-o structur de arbore binar
ordonat apare n secvena [8.3.5.c].

Procedura local SuprimaPred, caut predecesorul n inordine al nodului x,


realiznd suprimarea acestuia conform metodei descrise (are cel mult un fiu).

Dup cum se observ, procedura SuprimaPred se utilizeaz numai n


situaia n care nodul x are doi fii.
------------------------------------------------------------{Suprimarea unui nod ntr-un ABO. Cazul 2: nodul de suprimat
are doi fii}
PROCEDURE Suprima(x:TipCheie; VAR b:TipABO);
VAR q:RefTipNod;
PROCEDURE SuprimaPred(VAR r:RefTipNod);
BEGIN
IF r^.drept<>NIL THEN
SuprimaPred(r^.drept)
ELSE
BEGIN
q^.cheie:=r^.cheie;
q^.numar:=r^.numar;
q:=r;
r:=r^.stang
END
END; {SuprimaPreded}
BEGIN {Suprimare}
IF b=NIL THEN
WRITELN(' nodul nu se gaseste')

[8.3.5.c]

ELSE
IF x<p^.cheie THEN
Suprimare(x,p^.stang)
ELSE
IF x>p^.cheie THEN
Suprimare(x,p^.drept)
ELSE
BEGIN
q:=p;
IF q^.drept=NIL THEN
p:=q^.stang
ELSE
IF q^.stang=NIL THEN
p:=q^.drept
ELSE
SuprimaPred(q^.stang);
{DISPOSE(q)}
END
END; {Suprimare}
-------------------------------------------------------------

Procedura SuprimaPred:
(1) Gsete pointerul r care indic nodul avnd cea mai mare cheie, dintre
cheile subarborelui stng, al arborelui care are drept rdcin nodul cu cheia x
(nodul de suprimat).

(2) nlocuiete cmpurile nodului cu cheia x, indicat de pointerul q, cu


cmpurile nodului indicat de r (cu excepia nlnuirilor)

Suprim nodul indicat de r, acesta din urm avnd un singur fiu (sau niciunul).
Pentru a ilustra comportarea acestei proceduri n fig.8.3.5.c se prezint:
O structur de arbore binar ordonat (a)
Din care se suprim n mod succesiv nodurile avnd cheile 7, 8, 4, i 6
(fig.8.3.5.c (b-e)).

6
8

4
5

4
9

(b)

(a)

6
9

4
2

5
9

2
(e)

5
(c)

(d)

Fig. 8.3.5.c. Suprimarea nodurilor ntr-o structur de arbore binar ordonat

Exist i o alt soluie de a rezolva suprimarea n cazul n care nodul x are doi fii i
anume:
1. Se caut succesorul nodului x n ordonarea n inordine a cheilor arborelui.
Se demonstreaz c el exist i ca nu are fiu stng.
2. Pentru suprimare se procedeaz analog ca i n cazul anterior, cu deosebirea
c totul se realizeaz simetric (n oglind).

n acest caz de fapt se caut nodul cu cea mai mic cheie a subarborelui drept al
subarborelui care-l are pe x drept rdcin

Pentru o mai bun nelegere a celor prezentate se reamintete o proprietate a arborilor


binari ordonai:

Proiecia pe abscis a nodurilor unui arbore binar, conduce la ordonarea lor n


inordine.

n cazul arborilor binari ordonai se obine de fapt secvena ordonat a cheilor


arborelui.
8.3.6. Analiza cutrii n arbori binari ordonai

n general, n activitatea de programare se manifest o anumit suspiciune fa de


cutarea i inseria nodurilor ntr-o structur de arbore binar ordonat.

Aceast suspiciune este motivat de faptul c programatorul n general nu are controlul


creterii arborelui i ca atare nu poate anticipa cu suficient precizie forma acestuia.

Dup cum s-a precizat, efortul de cutare al unei chei variaz ntre O(log2 n) pentru
arborele binar perfect echilibrat (de nlime minim) i
degenerat ntr-o list liniar.

O(n/2) pentru arborele

Cele dou situaii reprezint extremele situaiilor reale iar probabilitatea ca ele s apar
n este n general redus [Wi76].

Cazul general care va fi analizat n continuare, se refer la:


Determinarea lungimii medii an a drumului de cutare, corespunztor tuturor
celor n chei i tuturor celor n! arbori care pot fi generai pornind de la cele n!
permutri ale celor n chei originale.

Se consider c cele n chei sunt distincte avnd valorile 1,2,...,n, i se


presupune c sosesc n ordine aleatoare cu o distribuie normal a probabilitii
de apariie.

n acest context lungimea medie a drumului de cutare ntr-un arbore binar


cu n noduri, an se definete ca fiind o sum de n termeni, fiecare termen fiind
produsul dintre nivelul unui nod al arborelui i probabilitatea sa de acces.

Dac se presupune c toate nodurile sunt n mod egal cutate (au probabilitatea
de acces 1/n), atunci formal lungimea medie a drumului de cutare an apare n
[8.3.6.a] unde pi este lungimea drumului de la rdcin la nodul i (adncimea
nodului i).
------------------------------------------------------------an =

1
n

[8.3.6.a]

i =1

------------------------------------------------------------ Calculnd valoarea lungimii medii a drumului de cutare an se ajunge la formula


recursiv [8.3.6.g].
------------------------------------------------------------an =

1
((n2 1)an1 + 2n 1)
2
n

[8.3.6.g]

-------------------------------------------------------------

Pe de alt parte, an poate fi exprimat ntr-o form nerecursiv utiliznd termenii funciei
armonice H [8.3.6.h] dup cum se prezint n relaia [8.3.6.i]
------------------------------------------------------------Hn =1+

1 1
1
+ + ... +
2 3
n

[8.3.6.h]

------------------------------------------------------------an = 2

n +1
Hn 3
n

[8.3.6.i]

-------------------------------------------------------------

Se poate verifica faptul c relaia [8.3.6.i] verific relaia recursiv [8.3.6.g].


Dar valoarea aproximativ a lui Hn poate fi determinat n baza formulei lui Euler
[8.3.6.j].

------------------------------------------------------------H n = + ln( n ) +

1
+ ...
12 n 2

[8.3.6.j]

------------------------------------------------------------unde 0.577 este constanta lui Euler.

Dac se nlocuiete aceast valoare n formula [8.3.6.i] rezult urmtoarea valoare


pentru lungimea medie a drumului de cutare ntr-un arbore binar ordonat
oarecare cu n chei [8.3.6.k].

------------------------------------------------------------a n 2[ln(n) + ] = 2 ln(n) c


[8.3.6.k]
-------------------------------------------------------------

ntruct lungimea medie a drumului de cutare ntr-un arbore binar perfect echilibrat
este [8.3.6.l]:
------------------------------------------------------------a n/ = log 2 (n) 1

[8.3.6.l]

-------------------------------------------------------------

Neglijnd termenii constani care pentru valori mari ale lui n devin neglijabili i trecnd
la limit, obinem relaia final [8.3.6.m].
------------------------------------------------------------an 2 ln(n) 2 ln(n)
=
=
= 2 ln 2 1.386
[8.3.6.m]
/
lim
log 2 (n) ln(n)
n an
ln 2
-------------------------------------------------------------

Concluzia este c nlocuind arborele binar perfect echilibrat cu un arbore binar


aleatoriu, efortul de cutare crete n medie cu 39 %.

Desigur, creterea acestui efort poate fi mult mai mare, dac arborele aleatoriu
este nefavorabil, spre exemplu degenerat ntr-o list, dar aceast situaie are o
probabilitate foarte mic de a se realiza.

Cele 39 % impun practic limita efortului adiional de calcul care poate fi cheltuit n mod
profitabil pentru reorganizarea structurii dup inserarea cheilor.

n acest sens un rol esenial l joac raportul dintre numrul de accese la noduri
(cutri) i numrul de inserii realizate n arbore.

Cu ct acest raport este mai mare cu att reorganizarea structurii este mai
justificat.

n general valoarea 39 % este suficient de redus pentru ca n majoritatea aplicaiilor s

se recurg la tehnici directe de inserare i s nu se fac uz de reorganizare dect n


situaii deosebite.

8.3.7. Arbori binari parial ordonai

O structur aparte de arbore binar o reprezint structura de arbore binar parial ordonat.
Caracteristica esenial a unui astfel de arbore este aceea c cheia oricrui nod nu este
mai mare (mic) dect cheile fiilor si.

Un exemplu de astfel de arbore apare n figura 8.3.7.a.

11

14

19

10

16

15

Fig.8.3.7.a. Arbore binar parial ordonat

Deoarece un arbore binar parial ordonat este de fapt un arbore binar, se poate realiza o
reprezentare eficient a sa cu ajutorul unui tablou liniar aplicnd tehnica specificat la
paragraful 8.2.4.1.

Aceast reprezentare este cunoscut i sub numele de ansamblu (heap) i a fost


definit n partea I (sortare prin metoda ansamblelor - Vol.1 &3.2.5.)

La o analiz mai atent se observ c de fapt un ansamblu este din punct de vedere al
reprezentrii un arbore binar complet.

Spre exemplu arborele binar parial ordonat din figura 8.3.7.a apare reprezentat ca un
ansamblu n figura 8.3.7.b.
1

10

11

16

15

14

19

10

Fig.8.3.7.b. Reprezentarea unui arbore binar parial ordonat ca un ansamblu

Structura ansamblu permite implementarea eficient i foarte elegant att a unor

metode de sortare (sortarea prin metoda ansamblelor - Vol.1 &3.2.5) ct i a


unor structuri de date derivate din liste (cozi bazate pe prioritate - Vol.1
&6.5.5.3).

8.3.8. Aplicaii ale arborilor binari ordonai


8.3.8.1. Problema concordanei

n cadrul acestui paragraf se propune reluarea problemei concordanei prezentat n


Vol.1 i rezolvarea ei cu ajutorul structurilor de date de tip arbore.

Se reamintete c problema concordanei const de fapt n determinarea


frecvenelor de acces ale cuvintelor unui text.

Problema se formuleaz astfel:


Se consider un text format dintr-o succesiune de cuvinte.
Se parcurge textul i se delimiteaz cuvintele.
Pentru fiecare cuvnt se verific dac este sau nu la prima apariie.
n caz afirmativ cuvntul se nregistreaz i contorul asociat se iniializeaz pe
valoarea 1

n caz negativ se incrementeaz contorul asociat cuvntului care memoreaz


numrul de apariii

n final se dispune de lista (ordonat) a tuturor cuvintelor i de numrul de


apariii ale fiecruia.

n acest scop, nodurile reprezentnd cuvintele sunt organizate ntr-o structur de


arbore binar ordonat, pornind de la un arbore vid.

Procesul se desfoar dup cum urmeaz


Se citete un nou cuvnt i se caut n arbore:
Dac nu se gsete atunci cuvntul se insereaz
Dac cuvntul se gsete, atunci se incrementeaz contorul de apariii al
cuvntului respectiv

Procesul continu pn la epuizarea tuturor cuvintelor textului analizat


Se presupune c un nod al structurii arbore binar ordonat are structura precizat n

secvena [8.3.8.1.a].
-----------------------------------------------------------{Problema concordanei. Implementare bazat pe arbori binari
ordonai}
TYPE RefTipNod=^cuvant
cuvant=RECORD
cheie:integer;
[8.3.8.1.a]
contor:integer;
stang,drept:RefTipNod
END;
------------------------------------------------------------ Fie radacina o variabil pointer care indic rdcina arborelui binar ordonat.
Programul care rezolv problema concordanei apare n secvena [8.3.8.1.b].
------------------------------------------------------------PROGRAM Concordanta;
TYPE

RefTipNod=^cuvant;
cuvant=RECORD
cheie:integer;
contor:integer;
stang,drept:RefTipNod
END;
VAR radacina:RefTipNod; cuv:integer;
PROCEDURE Imprarbore(r:RefTipNod);
BEGIN
IF r<>NIL THEN
BEGIN
Imprarbore(r^.stang);
WRITELN(r^.cheie,r^.contor);
Imprarbore(r^.drept)
END
END; {Imprarbore}

PROCEDURE Cauta(x:integer; VAR p:RefTipNod);


BEGIN
IF p=NIL THEN {cuvntul nu se gsete, deci inserie}
BEGIN
new(p);
[8.3.8.1.b]
p^.cheie:=x; p^.contor:=1;
p^.stang:=NIL; p^.drept:=NIL
END
ELSE
IF x<p^.cheie THEN
Cauta(x,p^.stang)
ELSE
IF x>p^.cheie THEN
cauta(x,p^.drept)
ELSE {cuvntul s-a gsit, incrementare contor}
p^.contor:=p^.contor+1
END; {Cauta}
BEGIN {PROGRAM principal}
radacina:=NIL; {*}
Read(cuv);
WHILE cuv<>0 DO
BEGIN
Cauta(cuv,radacina);
Read(cuv)
END;
Imprarbore(radacina)
END.
-------------------------------------------------------- Pentru simplificare se presupune ca textul analizat const dintr-o succesiune de
numere ntregi care modeleaz cuvintele textului, iar cifra 0 este utilizat ca
terminator.

Textul se introduce prin furnizarea numerelor de la tastatur.


Procedura Cauta realizeaz urmtoarele:
(1) Caut cheia cuv n arborele indicat de pointerul radacina
(2) Dac nu o gsete, insereaz cheia n arbore
(3) Dac gsete cheia incrementeaz contorul corespunztor
Dup cum se observ, aceast procedur este o combinaie a cutrii i creerii arborilor
binari ordonai.

Metoda de parcurgere a arborelui este cea prezentat la cutarea n arbori binari


ordonai varianta recursiv (&8.3.3)

Dac nu se gsete nici un nod cu cheia cuv atunci are loc inseria similar celei
utilizate n cadrul procedurii Insereaza1 definit la inseria n arbori binari ordonai
varianta 1 ( &8.3.4)

Procedura recursiv Imprarbore parcurge nodurile arborelui n inordine afindu-le


unele sub altele, fr a reflecta ns i structura arborelui, element care difereniaz
aceast procedur de cea prezentat n secvena [8.2.7.1.a.].

8.4. Arbori binari echilibrai. Arbori AVL


8.4.1. Definirea arborilor echilibrai AVL

Din analiza cutrii n arbori binari ordonai prezentat n &8.3.6. rezult n mod
evident c o procedur de inserare care restaureaz structura de arbore astfel nct ea s
fie tot timpul perfect echilibrat nu este viabil, deoarece activitatea de restructurare
este foarte complex.

Cu toate acestea sunt posibile anumite ameliorri, dac termenul "echilibrat"


este definit ntr-o manier mai puin strict.

Astfel de criterii de echilibrare "imperfect" pot conduce la tehnici mai simple


de reorganizare a structurilor de arbori binari ordonai, al cror cost deterioreaz
ntr-o msur redus performana medie de cutare.

Una dintre aceste definiii ale echilibrrii arborilor binari ordonai este cea propus de
Adelson, Velskii i Landis n 1962 i care are urmtorul enun:

Un arbore binar ordonat este echilibrat dac i numai dac pentru oricare nod al
arborelui, nlimile celor doi subarbori difer cu cel mult 1.

Arborii care satisfac acest criteriu se numesc "arbori AVL" dup numele
inventatorilor.

n cele ce urmeaz, aceti arbori vor fi denumii "arbori echilibrai".


Se atrage atenia asupra faptului c arborii perfect echilibrai sunt de asemenea
arbori de tip AVL.

Aceast definiie are cteva avantaje:


(1) Este foarte simpl
(2) Conduce la o procedur viabil de reechilibrare
(3) Asigur o lungime medie a drumului de cutare practic identic cu cea a
unui arbore perfect echilibrat.

n acest context se vor studia urmtorii operatori defini n cadrul structurii arbore
echilibrat:

1o Inseria unui nod cu o cheie dat;


2o Suprimarea unui nod cu o cheie dat.

Toi aceti operatori necesit un efort de calcul de ordinul O(log n), unde n este
numrul nodurilor structurii, chiar n cel mai defavorabil caz.

Optimul este atins de arborii echilibrai avnd un numr de noduri n=2k-1.


8.4.2. Inseria nodurilor n arbori echilibrai AVL

Se d un arbore AVL avnd rdcina R i pe S de nlime hS i pe D de nlime hD, pe


post de subarbori stng respectiv drept

Se cere s se insereze un nod nou n acest arbore.


n cazul inseriei se pot distinge trei cazuri.
Se presupune c nodul nou se insereaz n subarborele stng S, determinnd
creterea cu 1 a nlimii acestuia.
1. hS=hD : n urma inseriei S i D devin de nlimi inegale, fr ns a
viola criteriul echilibrului.
2. hS<hD : n urma inseriei S i D devin de nlimi egale, echilibrul fiind
mbuntit.
3. hS>hD : criteriul echilibrului este violat i arborele trebuie reechilibrat.

Astfel, n arborele echilibrat din figura 8.5.3.a:


Nodurile 9 sau 11 pot fi inserate fr reechilibrare.
Inseria unuia din nodurile 1,3,5 sau 7 necesit ns reechilibrarea arborelui.

10

11

Fig.8.5.3.a. Arbore echilibrat AVL

O analiz atent a situaiilor posibile care rezult n urma inseriei evideniaz faptul c
exist numai dou configuraii care necesit tratamente speciale.

Celelelate configuraii pot fi reduse la aceste dou situaii din considerente de simetrie.
Prima situaie se refer la inseria nodurilor 1 sau 3 n arborele reprezentat cu
linie continu n figura 8.5.3.a

Cea de-a doua situaie se refer la inseria nodurilor 5 sau 7 n arborele din
figura 8.5.3.a

Cele dou situaii sunt prezentate n figurile 8.5.3.b i 8.5.3.c, fiecare n cte trei
ipostaze (a), (b) i (c) care evolueaz de la simplu la complicat.

Cele dou situaii sunt denumite cazul "1 Stnga" respectiv cazul "2
Stnga".

Ambele cazuri presupun creterea subarborelui stng S, ca atare reprezint


un caz stnga.

Cazul 1 Stnga presupune creterea subarborelui stng al


subarborelui stng al arborelui n cauz,

Cazul 2 Stnga presupune creterea subarborelui drept al


subarborelui stng al arborelui n cauz.

Elementele adugate prin inserie apar cu linie punctat.


Prin transformri simple, structurile de arbori se reechilibreaz.
n cazul 1 Stnga este vorba despre o rotaie simpl de dou noduri A
respectiv B

n cazul 2 Stnga este vorba despre o rotaie dubl n care sunt implicate
trei noduri: A,B i C.

Se subliniaz faptul c arborii AVL fiind arbori ordonai,


singurele micri permise ale nodurilor sunt cele pe vertical.

Poziiile relative ale proieciilor pe orizontal ale nodurilor aparinnd unui


arbore AVL, trebuie s rmn nemodificate.

5
3

8
1

B
5

(a)
(b)

B
A

14

13

10

11

15

12

12

10

14

13

11

15

(c)

Fig.8.5.3.b. Echilibrarea arborilor AVL. Cazul 1Stnga


A

C
A

(a)
(b)
12

A
4

13

11

12

15

10

14

10

14

11

13

15

Fig.8.5.3.c. Echilibrarea arborilor AVL. Cazul 2 Stnga

Sinteza acestor cazuri precum i modul sintetic n care se realizeaz procesul de


echilibrare pentru cazurile pe stnga sunt prezentate n figurile 8.5.3.d i 8.5.3.e.

D
S

hd

hs

D
SS S

SD

SS

SD DS

D DD

Fig.8.5.3.d. Echilibrarea arborilor AVL. Cazul 1 Stnga. Schema general

S
A

SD

SS

D
SDS

SDD

B
A

C
S

SS

SDS SD

SDD DS

DDD

Fig.8.5.3.e. Echilibrarea arborilor AVL. Cazul 2 Stnga. Schema general

Aceleai scheme sintetice de data aceasta pentru cazurile pe dreapta apar n


figurile 8.5.3.f respectiv 8.5.3.g.

Este vorba despre cazurile 1 respectiv 2 Dreapta.

B
S

A
D

DS

DD

DSSD

DDD

Fig.8.5.3.f. Echilibrarea arborilor AVL. Cazul 1 Dreapta. Schema general


C
D
A
S

B
DS

DSS

DD

DSD

B
A

SSS

DSSSD DSDDS

DD

Fig.8.5.3.g. Echilibrarea arborilor AVL. Cazul 2 Dreapta. Schema general

De aceast dat a crescut subarborele drept al arborelui original i e necesar


reechilibrarea.

n oglind cu cazurile pe stnga i aici distingem:


Cazul 1 Dreapta care presupune creterea subarborelui drept al subarborelui
drept al arborelui original,

Cazul 2 Dreapta care presupune creterea subarborelui stng al subarborelui


drept al arborelui original.

i aici reechilibrarea se rezolv prin una sau dou rotaii ale nodurilor A i B, respectiv
ale nodurilor A, B i C.

Principial procesului de echilibrare mpreun cu modalitatea efectiv de restructurare


apar pentru fiecare din cele dou cazuri n figurile mai sus precizate.

Un algoritm pentru inserie i reechilibrare depinde n mod critic de maniera n care este
memorat informaia referitoare la situaia echilibrului arborelui.

O soluie este aceea prin care se atribuie fiecrui nod un factor explicit de echilibru.
Factorul de echilibru se refer la subarborele a crui rdcin o constituie nodul
n cauz.

Factorul de echilibru al unui nod, va fi interpretat ca i diferena dintre nlimea


subarborelui su drept i nlimea subarborelui su stng.

n acest caz structura unui nod devine [8.5.3.a]:


------------------------------------------------------------{Structura unui nod al unui arbore AVL}
TYPE TipRef=^TipNod
TipNod=RECORD
cheie:integer;
[8.5.3.a]
contor:integer;
stang,drept:TipRef;
ech:(-1,0,+1)
END;
------------------------------------------------------------

Pornind de la structura de nod definit n secvena [8.5.3.a], inseria unui nod se


desfoar n trei etape:
1. Se parcurge arborele binar, pentru a verifica dac nu cumva cheia exist deja
2. Se nsereaz noul nod i se iniializeaz factorul su de echilibru pe valoarea zero
3. Se revine pe drumul de cutare i se verific factorul de echilibru pentru fiecare
nod ntlnit, procedndu-se la echilibrare acolo unde este cazul

Aceast metod realizeaz unele verificri redundante deoarece:


Odat echilibrul stabilit, nu mai este necesar verificarea factorului de
echilibru pentru strmoii nodului

Cu toate acestea, se va face totui uz de ea, deoarece:


(1) Este uor de neles

(2) Se poate implementa printr-o extindere a procedurilor recursive de cutare i


inserie a nodurilor n arbori binari ordonai, descrise n & 8.3.4.

Aceste proceduri care includ operaia de cutare a unui nod, datorit formulrii lor
recursive, asigur n manier implicit "revenirea de-a lungul drumului de cutare".

Informaia care trebuie transmis la revenirea din fiecare pas este cea referitoare la
modificarea nlimii subarborelui n care s-a fcut inseria.

Din acest motiv, n lista de parametri ai procedurii se introduce parametrul variabil


de tip boolean h, a crui valoare "adevrat" semnific creterea nlimii
subarborelui.

Se presupune c procedura de inserie revine din subarborele stng la un nod p^ (vezi


fig.8.5.3.h), cu indicaia c nlimea sa a crescut

Se pot distinge trei situaii referitoare la nlimea subarborelui naintea respectiv


dup realizarea inseriei:

1. hS<hD, deci p^.ech=+1; Dup inserie factorul de echilibru devine


p^.ech=0,ca atare inechilibrul anterior referitor la nodul p a fost
rezolvat;
2. hS=hD, deci p^.ech=0; Dup inserie factorul de echilibru devine
p^.ech=-1, n consecin greutatea este acum nclinat spre stnga,
dar arborele rmne echilibrat n sensul AVL;
3. hS>hD, deci p^.ech=-1; ca atare este necesar reechilibrarea
arborelui.

(+1)

(0)

hs

(-1)

hd
S

D
1

D
2

(-1)

(-1)

(-1)

(+1)

D
Caz 1 Stanga

D
0

D
Caz 2 Stanga

Fig.8.5.3.h. Inseria n arbori AVL. Cazul Stnga. Schema general

n cazul 30, inspectarea factorului de echilibru al rdcinii subarborelui stng


(p1^.ech) conduce la stabilirea cazului 1 Stnga sau cazul 2 Stnga.

(1) Dac acest nod are la rndul su nlimea subarborelui su stng mai mare
ca cea a celui drept, adic factorul de echilibru egal cu (-1), suntem n cazul 1
Stnga.

(2) Dac factorul de echilibru al acestui nod este egal cu (+1) suntem n cazul
2 Stnga (fig. 8.5.3.h).

(3) n aceast situaie nu poate apare un subarbore stng a crui rdcin are un
factor de echilibru nul [Wi76].

Operaia de reechilibrare const dintr-o secven de reasignri de pointeri.


De fapt pointerii sunt schimbai ciclic, rezultnd fie o rotaie simpl fie o
rotaie dubl a dou respectiv trei noduri implicate.

n plus, pe lng rotirea pointerilor, factorii de echilibru respectivi sunt


reajustai.

Procedura care realizeaz acest lucru apare n secvena[8.5.3.b]. Principiul de lucru este
cel ilustrat n figura 8.5.3.h.
-----------------------------------------------------------{Inseria unui nod ntr-un arbore echilibrat AVL}
PROCEDURE InsertEchilibrat(x:TipCheie; VAR p:TipRef;
VAR h:BOOLEAN);
VAR p1,p2:TipRef; {h=fals}
BEGIN
IF p=NIL THEN
BEGIN {cuvntul nu e arbore; se insereaz}
new(p); h:=TRUE;
p^.cheie:=x; p^.contor:=1;
p^.stang:=NIL; p^.drept:=NIL; p^.ech:=0
END
ELSE
IF x<p^.cheie THEN
BEGIN
InsertEchilibrat(x,p^.stang,h);
IF h THEN {ramura stng a crescut n
nlime}
CASE p^.ech OF
+1: BEGIN
p^.ech:=0; h:=FALSE
END;
[8.5.3.b]
0: p^.ech:=-1;
-1: BEGIN {reechilibrare}
p1:=p^.stang;
IF p1^.ech=-1 THEN
BEGIN {cazul 1 stnga}
p^.stang:=p1^.drept;
p1^.drept:=p;
p^.ech:=0; p:=p1

END
ELSE
BEGIN { cazul 2 stnga}
p2:=p1^.drept;
p1^.drept:=p2^.stang;
p2^.stang:=p1;
p^.stang:=p2^.drept;
p2^.drept:=p;
IF p2^.ech=-1 THEN
p^.ech:=+1
ELSE
p^.ech:=0;
IF p2^.ech:=+1 THEN
p1^.ech:=-1
ELSE
p1^.ech:=0;
p:=p2
END;
p^.ech:=0; h:=FALSE
END
END {CASE}
END
[8.5.3.b]
ELSE
IF x>p^.cheie THEN
BEGIN
InsertEchilibrat(x,p^.drept,h);
IF h THEN {ramura dreapta a crescut
n nlime}
CASE p^.ech OF
-1: BEGIN
p^.ech:=0; h:=FALSE
END;
0: p^.ech:=+1;
+1: BEGIN {reechilibrare}
p1:=p^.drept;
IF p1^.ech=+1 THEN
BEGIN {cazul 1 dreapta}
p^.drept:=p1^.stang;
p1^.stang:=p;
p^.ech:=0; p:=p1
END
ELSE
BEGIN {cazul 2 dreapta}
p2:=p1^.stang;
p1^.stang:=p2^.drept;
p2^.drept:=p1;
p^.drept:=p2^.stang;
p2^.stang:=p;
IF p2^.ech=+1 THEN
p^.ech:=-1
ELSE
p^.ech:=0;
IF p2^.ech=-1 THEN
p1^.ech:=+1
ELSE
p1^.ech:=0;
p:=p2
[8.5.3.b]
END;

p^.ech:=0; h:=FALSE
END
END {CASE}
END
ELSE
BEGIN
p^.contor:=p^.contor+1;
END
END; {InsertEchilibrat}
------------------------------------------------------------ Procedura InsertEchilibrat funcioneaz dup cum urmeaz:

1. Iniial se parcurge arborele indicat de referina p pe stnga respectiv pe dreapta


dup valoarea cheii x care se caut. Parcurgerea se realizeaz prin apeluri
recursive ale procedurii InsertEchilibrat;
2. Dac se ajunge la o referin p=nil are loc inseria, cu modificarea lui h=TRUE
specificnd astfel c nlimea subarborelui a crescut;
3. Dup o astfel de inserie se revine din apelul recursiv i se verific echilibrul
nodului curent realizndu-se eventual echilibrarea pe stnga (dac se revine din
stnga) sau pe dreapta (dac se revine din dreapta).
4. Dac se gsete o cheie egala cu x se incrementeaz contorul nodului n cauz
5. Cu privire la variabila h se fac urmtoarele precizri:
Inseria l poziioneaz pe hTRUE;
Revenirile prin noduri cu factorul de echilibru 0 nu l modific pe h;
Reechilibrarea l poziioneaz pe hFALSE;

Pentru exemplificare se consider succesiunea de inserii ntr-un arbore AVL precizat


n figura 8.5.3.i.
+4
+10

+5

1S

1D
7
8

10

10

(a)

+6

+9

2S

(c)

2D
7

7
10

5
7

(b)

10

10

6
(d)

(e)

(f)

10

Fig.8.3.5.i. Inserii succesive ntr-un arbore echilibrat AVL.

Se consider arborele echilibrat AVL (a).


Inseria cheii 10 conduce la un arbore dezechilibrat (cazul 1 Dreapta), a crui
echilibrare perfect se realizeaz printr-o rotaie simpl dreapta, fig.8.5.3.i (b).

Inseriile nodurilor 5 i 4 conduc la dezechilibrarea subarborelui cu rdcina 7.


Echilibrarea sa se realizeaz printr-o rotaie simpl (cazul 1 Stnga) (d).

Inseria n continuare a cheii 6 produce din nou dezechilibrarea arborelui, a crui


echilibrare se realizeaz printr-o rotaie dubl stnga rezultnd arborele (e) (cazul
2 Stnga).

n sfrit, inseria nodului 9 conduce la cazul 2 Dreapta, care necesit n vederea


echilibrrii arborelui cu rdcina 8 o rotaie dubl care conduce la arborele
echilibrat AVL (f).

n legtur cu performanele inseriei ntr-un arbore echilibrat AVL se ridic dou


probleme:
1. Dac toate cele n! permutri de n chei apar cu probabilitate egal, care este
nlimea probabil a arborelui echilibrat care se construiete?
2. Care este probabilitatea ca o inserie s necesite reechilibrarea arborelui?

Analiza matematic a acestui complicat algoritm este nc o problem nerezolvat.


Teste empirice ale nlimii arborilor generai de algoritmul de inserie echilibrat
[8.5.3.b.] conduc la valoarea h=log(n)+c, unde c este o constant mic
(c0.25).

Aceasta nseamn c n practic, arborii echilibrai AVL, se comport la fel de


bine ca i arborii perfect echilibrai, fiind ns mai uor de realizat.

Testele empirice sugereaz de asemenea c n medie, reechilibrarea este necesar


aproximativ la fiecare dou inserii.

Att rotaiile simple ct i cele duble sunt echiprobabile.


Complexitatea operaiei de reechilibrare sugereaz faptul c arborii echilibrai trebuie
utilizai de regul cnd operaiile de cutare a informaiei sunt mult mai frecvente dect
cele de inserare.
8.4.3. Suprimarea nodurilor n arbori echilibrai AVL

i n cazul arborilor echilibrai AVL, suprimarea este o operaie mai complicat dect
inseria.

n principiu ns, operaia de reechilibrare rmne aceeai, reducndu-se la una sau dou
rotaii la stnga sau la dreapta.

Tehnica care st la baza suprimrii nodurilor n arbori echilibrai AVL este similar
celei utilizate n cazul arborilor binari ordonai prezentat n &8.3.5.

Cazul evident este cel n care, nodul care se suprim este un nod terminal sau
are un singur descendent.

Dac nodul de suprimat are ns doi descendeni, el va fi nlocuit cu cel mai din
dreapta nod al subarborelul su stng.

Ca i n cazul inseriei, se utilizeaz variabila booleean h a crei valoarea adevrat


semnific reducerea nlimii subarborelui.

Reechilibrarea se execut numai cnd h este adevrat.


Variabila h se poziioneaz pe adevrat dup suprimarea unui nod al structurii,
sau dac reechilibrarea nsi reduce nlimea subarborelui.

Tehnica suprimrii nodurilor din arbori echilibrai AVL este materializat de procedura
SuprimEchilibrat secvena [8.5.4.a]
------------------------------------------------------------{Suprimarea unui nod ntr-un arbore echilibrat AVL}
PROCEDURE SuprimEchilibrat(x:TipCheie; VAR p:TipRef;
VAR h:BOOLEAN);
VAR q:TipRef; {h=fals}
PROCEDURE Echilibru1(VAR p:TipRef: VAR h:BOOLEAN);
VAR p1,p2:TipRef;
e1,e2:(-1,0,+1);
BEGIN {h=adevrat,ramura stnga a devenit mai mic}
CASE p^.ech OF
-1: p^.ech:=0;
0: BEGIN
p^.ech:=+1; h:=FALSE
END;
+1: BEGIN {reechilibrare}
[8.5.4.a]
p1:=p^.drept; e1:=p1^.ech;
IF e1>=0 THEN
BEGIN {cazul 1 dreapta}
p^.drept:=p1^.stang; p1^.stang:=p;
IF e1=0 THEN
BEGIN
p^.ech:=+1; p1^.ech:=-1;
h:=FALSE
END
ELSE
BEGIN
p^.ech:=0; p1^.ech:=0
END;
p:=p1
END
ELSE

BEGIN {cazul 2 dreapta}


p2:=p1^.stang; e2:=p2^.ech;
p1^.stang:=p2^.drept; p2^.drept:=p1;
p^.drept:=p2^.sting;
p2^.stang:=p;
IF e2=+1 THEN
p^.ech:=-1
ELSE
p^.ech:=0;
IF e2=-1 THEN
p1^.ech:=+1
ELSE
p1^.ech:=0;
p:=p2; p2^.ech:=0
END

END
END {CASE}
END; {Echilibru1}

[8.5.4.a]

PROCEDURE Echilibru2(VAR p:TipRef; VAR h:BOOLEAN);


VAR p1,p2:TipRef;
e1,e2:(-1,0,+1);
BEGIN {h=adevarat,ramura dreapta a devenit mai mic}
CASE p^.ech OF
+1: p^.ech:=0;
0: BEGIN
p^.ech:=-1; h:=FALSE
END;
-1: BEGIN {reechilibrare}
p1:=p^.stang; e1:=p1^.ech;
IF e1<=0 THEN
BEGIN {cazul 1 stnga}
p^.stang:=p1^.drept; p1^.drept:=p;
IF e1=0 THEN
BEGIN
p^.ech:=-1; p1^.ech:=+1;
h:=FALSE
END
ELSE
BEGIN
p^.ech:=0; p1^.ech:=0
END;
p:=p1
END
ELSE
BEGIN {cazul 2 stnga}
p2:=p1^.drept; e2:=p2^.ech;
p1^.drept:=p2^.stang; p2^.stang:=p1;
p^.stang:=p2^.drept;
p2^.drept:=p;
IF e2=-1 THEN
p^.ech:=+1
ELSE
p^.ech:=0;
IF e2=+1 THEN
p1^.ech:=-1
ELSE
p1^.ech:=0;

p:=p2; p2^.ech:=0
END

END
END {CASE}
END; {Echilibru2}

PROCEDURE Suprima(VAR r:TipRef; VAR h:BOOLEAN);


BEGIN {h=false}
IF r^.drept<>NIL THEN
BEGIN
Suprima(r^.drept,h);
IF h THEN Echilibru2(r,h)
END
ELSE
BEGIN
[8.5.4.a]
q^.cheie:=r^.cheie;
q^.contor:=r^.contor;
r:=r^.stang; h:=TRUE
END
END; {Suprima}
BEGIN {SuprimaEchilibrat}
IF p=NIL THEN
BEGIN
WRITE('cheia nu e IN arbore'); h:=FALSE
END
ELSE
IF x<p^.cheie THEN
BEGIN
SuprimaEchilibrat(x,p^.stang,h);
IF h THEN Echilibru1(p,h)
END
ELSE
IF x>p^.cheie THEN
BEGIN
SuprimaEchilibrat(x,p^.drept,h);
IF h THEN Echilibru2(p,h)
END
ELSE
BEGIN {suprima p^}
q:=p;
IF q^.drept=NIL THEN
[8.5.4.a]
BEGIN
p:=q^.stang; h:=TRUE
END
ELSE
IF q^.stang=NIL THEN
BEGIN
p:=q^.drept; h:=TRUE
END
ELSE
BEGIN
Suprima(q^.stang,h);
IF h THEN Echilibru1(p,h)
END;
{DISPOSE(q)}
END
END; {SuprimaEchilibrat}

------------------------------------------------------------

n cadrul procedurii SuprimEchilibrat se definesc trei proceduri:


1. Echilibru1 care se aplic cnd subarborele stng s-a redus din nlime;
2. Echilibru2 care se aplic cnd subarborele drept s-a redus din nlime;
3. Suprima are rolul procedurii Supred la arbori binari ordonai:

(1) Gsete i nlocuiete nodul de suprimat cu predecesorul su


(2) Suprim predecesorul
(3) n plus procedura Suprima realizeaz eventualele reechilibrari la
revenirea recursiv pe drumul parcurs n arbore

Mersul procedurii SuprimEchilibrat este normal:


1. Se parcurge recursiv arborele AVL pentru cutarea cheii de suprimat, (apeluri
ale procedurii SuprimaEchilibrat pe stnga sau pe dreapta dup cum
cheia care se caut e mai mic respectiv mai mare dect cea a nodului curent);
2. Cnd se gsete cheia ea se suprim exact ca i la arborii binari ordonai:

Cazul 1 fiu: se rezolv prin suprimare direct;


Cazul 2 fii: se apeleaz procedura Suprima descris mai sus.
3. Este important de reamintit faptul c dup fiecare revenire dintr-un apel recursiv
se verific valoarea lui h i dac este necesar se apeleaz procedura
corespunztoare de echilibrare.

Modul de lucru al procedurii, este prezentat n figura 8.5.4.a.

-7

-11

(a)

1S

11

10

13

9
-9

11

12

(b)

10

14

13

12

14

-8

(c)

(d)

8
1D

10

13

12

-5

(f)
6

2D

13
10

14
12

-4

-10

(h)

(i)

(j)
1D

10
13

12

14
12

(g)

10
6

14

12

14

13
10

10

(e)

13

13

6
14

12

13
13

14

12

6
14

14
12

Fig.8.5.4.a. Suprimri succesive n arbori echilibrai AVL

Dndu-se arborele binar echilibrat (a), se suprim n mod succesiv nodurile avnd cheile
7,11,9,8,5,4 i 10, rezultnd arborii (b)...(j).

Suprimarea cheii 7 este simpl ns conduce la subarborele dezechilibrat cu


rdcina 6. Reechilibrarea acestuia presupune o rotaie simpl (cazul 1 stnga).

Suprimarea nodului 11 nu ridic probleme.


Reechilibrarea devine din nou necesar dup suprimarea nodului 9; de data
aceasta, subarborele avnd rdcina 10, este reechilibrat printr-o rotaie simpl
dreapta (cazul 1 dreapta).

Suprimarea cheii 8 este imediat


Dei nodul 5 are un singur descendent, suprimarea sa presupune o reechilibrare
mai complicat bazat pe o dubl rotaie (cazul 2 dreapta).

Ultimul caz, cel al suprimrii nodului cu cheia 10 presupune nainte de


reechilibrare, nlocuirea acestuia cu cel mai din dreapta element al arborelui su
stng (nodul cu cheia 6).

n cazul arborilor binari echilibrai, suprimarea unui nod se realizeaz n cel mai
defavorabil caz cu performaa O(log n).

Diferena esenial dintre inserie i suprimare n cazul arborilor echilibrai AVL este
urmtoarea:

n urma unei inserii, reechilibrarea se realizeaz prin una sau dou rotaii (a
dou sau trei noduri)

Suprimarea poate necesita n cel mai defavorabil caz, o rotaie simpl sau
dubl, a fiecrui nod situat pe drumul de cutare.

n realitate, testele experimentale indic faptul suprinztor c:


(1) n cazul inseriei reechilibrarea devine necesar aproximativ la fiecare a
doua inserie

(2) n cazul suprimrii reechilibrarea devine necesar aproximativ la fiecare a


5-a suprimare.

S-ar putea să vă placă și