Sunteți pe pagina 1din 25

n clasa grafurilor conexe, structurile cele mai simple, dar care apar cel mai

frecvent n aplicaii, sunt cele arborescente (arbori). n acest capitol sunt prezentate
principalele caracteristici ale arborilor, algoritmi pentru calculul arborelui parial de
cost minim, arbori direcionai, arbori cu rdcin i arbori binari. Pe lng operaiile
primitive asupra arborilor cutarea unei informaii, inserarea unui nod, extragerea
unui nod i metode de parcurgere, sunt prezentate dou clase importante de arbori
binari, i anume arbori de sortare i arbori de structur.



4.1 Grafuri de tip arbore


4.1.1 Definiii i caracterizri ale grafurilor de tip arbore

Definiia 4.1.1. Graful G este arbore dac G este aciclic i conex.
Definiia 4.1.2. Fie G=(V,E) graf arbore. Subgraful H=(V1,E1) al lui G este
un subarbore al lui G dac H este graf arbore.

Exemple:
4.1. Graful










este arbore, deoarece pentru orice pereche de vrfuri i,j, 1i,j 6, ij, exist un i-j
drum i graful nu conine cicluri.

1 3


4 2

5

STRUCTURI ARBORESCENTE
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
4.2. Graful










nu este arbore deoarece este conex, dar drumul :1,4,3,2,1 este un ciclu.

4.3. Graful










nu este arbore deoarece are dou componente conexe {1,2,3,4,5,6}, {7,8}.

Proprietatea unui graf de a fi arbore poate fi verificat prin algoritmi care
testeaz calitile de conexitate i aciclicitate. Verificarea proprietii unui graf de a fi
arbore poate fi realizat i pe baza urmtoarelor proprieti:
Proprietatea 1.: Un graf G=(V,E), cu m E , n V = = este de tip arbore dac
i numai dac G este aciclic i n=m+1. Cu alte cuvinte, problema revine la
verificarea aciclicitii grafului i a relaiei existente ntre numrul vrfurilor i
numrul muchiilor grafului.
Proprietatea 2: Un graf G=(V,E), cu m E , n V = = este de tip arbore dac
i numai dac G este conex i n=m+1.
Fie G=(V,E) un graf. Urmtoarele afirmaii sunt echivalente:
1. G este graf arbore;
2. G este graf conex minimal (oriare ar fi eE, prin eliminarea muchiei
e graful rezultat nu este conex);
1 3


4 2

5
6

1 3 7


4 2

5

6 8
Structuri arborescente
3. G este graf aciclic maximal (prin adugarea unei noi muchii n graf
rezult cel puin un ciclu).
Definiia 4.1.3. Un graf orientat D=(V,E), cu proprietatea c pentru
, E v , u E v , u , atunci vuE se numete graf asimetric. Digraful D este
simetric dac , E v , u uvE, dac i numai dac vuE.

Definiia 4.1.4. Fie D=(V,E) digraf netrivial. Graful G=(V,E), unde
E={uv/ uvE sau vuE} se numete suport al digrafului D.

Definiia 4.1.5. Un arbore direcionat este un graf orientat asimetric cu
proprietatea c graful suport corespunztor lui este graf arbore. Arborele direcionat
T=(V,E) este cu rdcin dac exist rV astfel nct, pentru orice uV, u r, exist
r-u drum n T. Vrful r se numete rdcina arborelui direcionat T.

Definiia 4.1.6. Dac T=(V,E) este arbore direcionat, atunci T1=(V1,E1)
este subarbore al lui T dac V1V, E1E i T1 este arbore direcionat.

Deoarece graful suport al unui arbore direcionat este aciclic, rezult c
pentru orice uV, u r, r-u drumul n T este unic. De asemenea, un arbore
direcionat are cel mult o rdcin. n consecin, pentru orice uV, u r, distana de
la rdcin la vrful u este egal cu numrul de muchii ale r-u drumului n T.

Exemple:
4.4. Arborele direcionat













este cu rdcin (vrful r este rdcina arborelui).

u
w x


t r y



v z
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
4.5. Arborele direcionat












nu are rdcin.

4.6. Arborele






este un subarbore cu rdcin x al arborelui din exemplul 4.5


4.1.2 Arbori orientai; reprezentri i parcurgeri

Definiia 4.1.7. Un arbore orientat este un arbore direcionat cu rdcin.
Deoarece un arbore orientat este un caz particular de digraf, pentru
reprezentarea unui arbore orientat poate fi utilizat oricare din modalitile prezentate
n 3.1. n plus, exist i posibilitatea obinerii unor reprezentri mai eficiente pentru
acest tip de graf.
Una dintre modaliti este reprezentarea FIU-FRATE, care const n
numerotarea convenional a vrfurilor grafului i reinerea, pentru fiecare vrf i al
arborelui, a urmtoarelor informaii:
- FIU(i), care reprezint numrul ataat primului descendent al vrfului i;
- FRATE(i), care reprezint numrul ataat vrfului descendent al tatlui
vrfului i i care urmeaz imediat lui i;
- INF(i), care reprezint informaia ataat vrfului i (de obicei valoarea i).
Pentru reprezentarea arborelui se rein rdcina i numrul nodurilor.
Absena fiului, respectiv a fratelui unui vrf, este marcat printr-o valoare
diferit de numerele ataate vrfurilor (de obicei valoarea 0).
u v


x


y


z w
y w

x

v
Structuri arborescente
Exemplu:
4.7. Arborele orientat














este reprezentat astfel:
N=15 (numrul nodurilor arborelui)
R=1 (rdcina), FIU=(2,5,7,9,0,10,0,0,13,0,0,0,0,0,0)


fiul lui 1 este 2 vrful 9 are fiul 13
FRATE=(0,3,4,0,6,0,8,0,0,11,12,0,14,15,0)


vrful 1 nu are frate vrful 14 are fratele 15

Utiliznd structurile de date dinamice pentru arbori orientai, se obine o
reprezentare descris n continuare. Presupunnd c fiecare vrf al arborelui are cel
mult n descendeni, fiecrui vrf i este ataat structura:

vector de legturi ctre descendenii vrfului identificatorul vrfului
legtur ctre fiul 1

legtur ctre fiul n

Dac un vrf are p<n descendeni, atunci primele p legturi sunt ctre
descendeni, iar ultimile n-p legturi sunt nil. Pentru n10, descrierea structurii de
date n limbajul Pascal este:
type ptnod=^nod;
nod=record
inf:integer;
leg:array[1..10] of ptnod;
end;
1


2 3 4




5 6 7 8 9



10 11 12 13 14 15
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
O parcurgere revine la aplicarea sistematic a unei reguli de vizitare a
vrfurilor grafului. Cele mai uzuale reguli de parcurgere a arborilor orientai sunt
prezentate n continuare.

A. Parcurgerea n A-preordine

Iniial vrful curent este rdcina arborelui. Se viziteaz vrful curent i sunt
identificai descendenii lui. Se aplic aceeai regul de vizitare pentru arborii care au
ca rdcini descendenii vrfului curent, arborii fiind vizitai n ordinea dat de
numerele ataate vrfurilor rdcin corespunztoare.

Exemplu:
4.8. Pentru arborele orientat din exemplul 4.7, prin aplicarea parcurgerii n
A-preordine, rezult: 1,2,5,6,10,11,12,3,7,8,4,9,13,14,15.

Pentru un arbore reprezentat FIU-FRATE, implementarea parcurgerii n
A-preordine se bazeaz pe urmtoarea procedur recursiv, avnd ca parametru de
intrare rdcina arborelui curent (vrful curent n momentul apelului).

procedure A_preordine (R);
if R0 then
vizit (R);
A_preordine(FIU[R]);
A_preordine(FRATE[R]);
endif;
end;

B. Parcurgerea A-postordine

Regula de vizitare a vrfurilor n parcurgerea n A-postordine difer de cea n
A-preordine numai prin faptul c rdcina fiecrui arbore este vizitat dup ce au fost
vizitate toate celelalte vrfuri ale arborelui.

Exemplu:
4.9. Pentru arborele orientat din exemplul 4.7, ordinea de vizitare a vrfurilor
este: 5,10,11,12,6,2,7,8,3,13,14,15,9,4,1.

Pentru arbori reprezentai prin structuri de date arborescente, implementarea
parcurgerii n A-postordine poate fi obinut pe baza urmtoarei proceduri recursive.
Unicul parametru (de intrare) reprezint rdcina arborelui curent n momentul
apelului.

procedure A_postordine (R);
if Rnil then
do-for i=1,n,1
A_postordine(R^.leg[i]);
Structuri arborescente
enddo;
vizit (R);
endif;
end;

Procedurile A-preordine i A-postordine sunt variante de parcurgeri n
adncime, fiind prioritare vrfurile aflate la distan maxim fa de rdcina
arborelui iniial.

C. Parcurgerea pe niveluri

Definiia 4.1.8. Un vrf v al unui arbore orientat cu rdcin r se afl pe
nivelul i al arborelui, dac distana de la vrf la rdcin (lungimea r-v drumului) este
egal cu i. Rdcina arborelui este de nivel 0.
Parcurgerea unui arbore orientat pe niveluri const n vizitarea vrfurilor sale
n ordinea cresctoare a distanelor fa de rdcin.

Exemplu:
4.10. Pentru arborele din exemplul 4.7, prin aplicarea parcurgerii pe niveluri,
rezult: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.

Implementarea parcurgerii pe niveluri se bazeaz pe utilizarea unei structuri
de coad C. La momentul iniial, rdcina arborelui este unicul element din C. Atta
timp ct coada este nevid, se extrage (cu tergere) un vrf din C, este vizitat i sunt
introdui n coad descendenii si. Calculul se ncheie n momentul n care, la
tentativa de extragere a unui vrf din C, se constat C=.
Parcurgerea pe niveluri este realizat de urmtoarea procedur care are ca
parametri de intrare reprezentarea FIU-FRATE a grafului. Procedurile push i pop
realizeaz operaiile de acces introducere-extragere n C.

procedure parcurgere_pe_niveluri(R,FIU,FRATE,n)
C:ptcoada;
C=nil;push(C,R);
while Cnil do
pop(C,v);
VIZIT(v);
v=FIU[v];
while v0 do
push(C,v);
v=FRATE[v];
endwhile;
endwhile;
end;

Programarea calculatoarelor Tehnica programrii n limbajul Pascal
Exemplu
4.11. Pentru arborele de la exemplul 4.7, evoluia algoritmului este:

C
t

t=1 1
t=2 2 3 4
t=3 3 4 5 6
t=4 4 5 6 7 8
t=5 5 6 7 8 9
t=6 6 7 8 9
t=7 7 8 9 10 11 12
t=8 8 9 10 11 12
t=9 9 10 11 12
t=10 10 11 12 13 14 15
t=11 11 12 13 14 15
t=12 12 13 14 15
t=13 13 14 15
t=14 14 15
t=15 15
t=16

deci vrfurile sunt vizitate n ordinea: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15.

Metoda BF pentru parcurgerea grafurilor este o generalizare a tehnicii de
parcurgere pe niveluri a arborilor orientai. O alternativ de implementare a
parcurgerii pe niveluri poate fi descris prin intermediul procedurilor recursive frai
i parc. Coada C este o variabil global i este iniializat cu rdcina arborelui.
Parcurgerea este obinut prin apelul parc(C).

procedure frai(v);
if v0 then
push(C,v);frai(FRATE[v];
endif;
end;

procedure parc;
if Cnil then
pop(C,v);VIZIT(v);
frai(FIU[v]); parc;
endif;
end;
Structuri arborescente
4.1.3 Arbori pariali; algoritmul Kruskal

Definiia 4.1.9. Fie G graf. Subgraful parial H este un arbore parial al lui G
dac H este graf arbore.
Definiia 4.1.10. Fie (V,E,w) un graf ponderat conex. Dac T=(V,E
0
) este un
arbore parial al grafului G=(V,E), ponderea arborelui T este definit prin:
W(T)=

0
E e
) e ( w .
Definiia 4.1.11. Fie T(G) mulimea arborilor pariali corespunztori grafului
G. T
0
T(G) este arbore parial minim pentru G dac W(T
0
)=min{W(T); TT(G)}.
Dac G este graf finit, atunci T(G) este mulime finit, deci orice graf finit
ponderat i conex are cel puin un arbore parial minim.
Pentru calculul unui arbore parial minim sunt cunoscui mai muli algoritmi.
n continuare este prezentat algoritmul Kruskal pentru determinarea unui arbore
parial minim al unui graf ponderat conex G=(V,E,w).

Pasul 1: i=1; E
0
=
Pasul 2: Determin mulimea
R={e/eE \ E
i-1
astfel nct graful (V,E
i-1
{e}) este aciclic}
Dac R=, atunci stop;
altfel, selecteaz e
i
R cu w(e
i
)=min{w(e), eR};
E
i
=E
i-1
{e
i
}
Pasul 3: i=i+1 i reia pasul 2.

Structura (V,E
i-1
) calculat de procedur este arbore parial minim al grafului
conex ponderat G.

Ideea algoritmului Kruskal revine la alegerea i includerea n mulimea de
muchii curente a unei muchii de cost minim nc neselectate i astfel nct s nu
formeze un ciclu cu muchiile selectate la etapele precedente. Algoritmul se ncheie
atunci cnd nici o alegere nu mai este posibil. Aplicarea metodei la grafuri neconexe
calculeaz o mulime de arbori pariali minimi, cte un arbore pentru fiecare
component conex.
Pentru implementarea algoritmului Kruskal, graful conex ponderat este
reprezentat sub form tabelar, muchiile fiind ordonate cresctor dup ponderi.
Muchiile selectate de algoritm pot fi meninute, de asemenea, ntr-o structur
tabelar, sau doar marcate ca fiind incluse n mulimea muchiilor arborelui parial
minim a crui construcie este dorit. n varianta prezentat n continuare muchiile
selectate sunt afiate.
Pentru verificarea condiiei ca muchia selectat s nu formeze nici un ciclu
cu muchiile selectate la etapele precedente, este utilizat un vector, TATA. Pentru
fiecare vrf i (vrfurile grafului fiind numerotate de la 1 la n, unde n este numrul
nodurilor grafului), componenta TATA [i] este predecesorul su n arborele care
conine vrful i construit pn la momentul curent, dac i nu este rdcina acelui
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
arbore, respectiv TATA[i] este egal cu numrul de vrfuri ale arborelui de
rdcin i, n caz contrar. Componentele vectorului TATA sunt iniializate cu
valoarea -1. Calculul care realizeaz adugarea unei noi muchii poate fi descris
astfel:
- este determinat o muchie de cost minim, e=v1v2, care nu a fost selectat
anterior;
- se verific proprietatea de aciclicitate a grafului care rezult prin eventuala
adugare a muchiei selectate astfel: dac vrfurile v1 i v2 nu aparin
aceluiai arbore, atunci proprietatea de aciclicitate este ndeplinit i
muchia e este adugat la structura curent. Determinarea valorii k
reprezentnd rdcina arborelui care conine vrful dat v rezult prin
parcurgerea vectorului TATA:
k=v;
while TATA[k] >0 do k=TATA[k]
endwhile;
- adugarea muchiei e selectate este realizat prin reunirea arborilor cu
rdcini r1 i r2, din care fac parte v1 i respectiv v2, astfel: dac
TATA[r1]<TATA[r2] (arborele de rdcin r1 conine mai multe vrfuri
dect arborele de rdcin r2), atunci arborele rezultat prin reunirea celor
doi arbori are ca rdcin vrful r1, iar vrful r2 devine fiu al lui r1
(TATA[r2]=r1 i TATA[r1] =TATA[r2]+TATA[r1] (numrul muchiilor
arborelui cu rdcin r1 este crescut cu numrul muchiilor arborelui cu
rdcin r2). n caz contrar se procedeaz analog, rdcina arborelui
rezultat prin reunire fiind r2, iar r1 devenind fiu al rdcinii.
Calculul se ncheie dup ce a fost adugat cea de-a (n-1)-a muchie.



4.2 Arbori binari


4.2.1 Reprezentare; parcurgeri

Definiia 4.2.1. Un arbore binar este un arbore orientat cu proprietatea c
pentru orice vrf v, od(v)2. n cazul od(v)=2, cei doi descendeni sunt desemnai ca
descendent stng (fiu stnga) respectiv descendent drept (fiu dreapta). Pentru
vrfurile cu od(v)=1, unicul descendent este specificat fie ca fiu stnga, fie ca fiu
dreapta.
Definiia 4.2.2. Se numete nod terminal orice vrf v al arborelui cu od(v)=0.
Nodul v este neterminal dac od(v)>0.
Reprezentarea unui arbore binar este realizat prin reinerea, pentru fiecare
nod, a legturilor ctre descendenii lui. Absena unui descendent este reprezentat
prin nil.
Structuri arborescente

identificator
nod
legtur fiu
stnga
legtur fiu
dreapta

Structura de date Pascal este:
type arb=^nod;
nod=record;
inf:integer;
fius,fiud:arb;
end;

Definiia 4.2.3. Fie T=(V,E) un arbore binar cu rdcina R. Subarborele
stng al lui T este ST=(V\{R},E\{RS}), unde S este fiul stnga al rdcinii.
Subarborele drept al lui T este DT=(V\{R},E\{RD}), unde D este fiul dreapta al
rdcinii.
n plus fa de metodele deja prezentate pentru parcurgerea arborilor generali
i care sunt aplicabile i n acest caz particular, parcurgerile n preordine(RSD),
inordine(SRD) i respectiv postordine(SDR) sunt special considerate pentru arbori
binari i au multiple aplicaii. Regula de vizitare revine la parcurgerea subarborelui
stng, a subarborelui drept corespunztori vrfului curent. La momentul iniial, vrful
curent este rdcina arborelui. Diferena ntre cele trei tipuri de parcurgere este dat
de momentul n care este vizitat fiecare vrf al arborelui. n parcurgerea RSD
(rdcin-subarbore stng-subarbore drept), fiecare vrf al arborelui este vizitat n
momentul n care devine vrf curent; n parcurgerea SRD (subarbore stng-rdcin-
subarbore drept), vizitarea vrfului este efectuat dup ce a fost parcurs subarborele
stng; n parcurgerea SDR (subarbore stng-subarbore drept-rdcin) vizitarea
fiecrui vrf este efectuat dup ce au fost parcuri subarborii afereni lui.
Procedura preordine realizeaz parcurgerea n preordine, metodele SRD i
SDR fiind propuse cititorului ca exerciii. Procedura preordine este recursiv i are
ca parametru de intrare vrful curent n momentul apelului.

procedure preordine(r:arb);
begin
if r<>nil then
begin
write(r^.inf);
preordine(r^.fius);
preordine(r^.fiud);
end;
end;


Programarea calculatoarelor Tehnica programrii n limbajul Pascal
4.2.2 Arbori binari de sortare

Definiia 4.2.4. Un arbore de sortare este un arbore binar cu proprietile:
fiecrui nod i al arborelui i este ataat o informaie INF(i) dintr-o
mulime ordonat de valori;
pentru fiecare nod i, INF(i) este mai mare dect INF(j), pentru toate
nodurile j din subarborele stng al arborelui cu rdcin i;
pentru fiecare nod i, INF(i) este mai mic dect INF(j), pentru toate
nodurile j din subarborele drept al arborelui cu rdcin i;
pentru orice vrfuri i,j, dac ij, atunci INF(i)INF(j).

Exemplu:
4.12. Arborele binar















este de sortare.

Operaiile uzuale efectuate asupra arborilor de sortare sunt inserarea unui
nod, tergerea unui nod i parcurgerea arborelui (n preordine, inordine sau
postordine). Inserarea i tergerea nodurilor ntr-un arbore de sortare trebuie realizate
astfel nct arborele rezultat s fie, de asemenea, arbore de sortare.
Parcurgerea n inordine a unui arbore de sortare determin secvena
vrfurilor arborelui n ordinea cresctoare a informaiilor ataate.

Exemplu:
4.13. Pentru arborele de sortare descris n exemplul 4.12, parcurgerea n
inordine determin secvena de valori: 20,30,40,50,60,70,80,90, adic exact vectorul
de informaii asociate nodurilor ordonat cresctor.
30
70
20 40
60
90
80
50
Structuri arborescente
Inserarea unui nod ntr-un arbore de sortare

Algoritmul de inserare a unei informaii nr n arborele de sortare de rdcin
rad este recursiv i const n efectuarea operaiilor. Vrful curent v la momentul
iniial este rdcina arborelui.
- 1. dac arborele de rdcin v este vid (v=nil), este generat arborele cu un
singur nod, avnd nr ca informaie ataat;
- 2. altfel
- a) dac informaia ataat nodului v este mai mare dect nr,
atunci vrful curent devine fiul stnga al lui v;
- b) dac informaia ataat nodului v este egal cu nr, atunci stop
(se previne duplicarea informaiilor ataate vrfurilor arborelui);
- c) dac informaia ataat nodului v este mai mic dect nr,
atunci vrful curent devine fiul dreapta al lui v.

Exemplu:
4.14. Aplicarea algoritmul descris pentru inserarea informaiei 55 n arborele
de sortare din exemplul 4.12 determin urmtoarele operaii:
INF(v)=50<55: se decide inserarea n subarborele drept cu rdcina avnd
informaia ataat 70 (cazul 2.c);
INF(v)=70>55: se decide inserarea n subarborele stng cu rdcina avnd
informaia ataat 60 (cazul 2.a);
INF(v)=60>55: se decide inserarea n subarborele stng cu rdcina nil
(situaia de la 1). Se decide crearea nodului cu informaie 55, fiu stng al nodului de
informaie 60.
Arborele rezultat este:















30
70
20 40
60
90
80
50
55
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
tergerea unei informaii dintr-un arbore de sortare

Algoritmul pentru tergerea unei informaii nr din arborele de sortare de
rdcin rad este recursiv este descris n continuare. Vrful curent v la momentul
iniial este rdcina arborelui.
- 1. dac arborele este vid (v=nil) atunci stop (nr nu se afl n mulimea
informaiilor ataate nodurilor arborelui);
- 2. altfel
- a) dac informaia ataat nodului v este mai mare dect nr,
atunci vrful curent devine fiul stnga al lui v ;
- b) dac informaia ataat nodului v este mai mic dect nr,
vrful curent devine fiul dreapta al lui v ;
- c) dac INF(v)=nr atunci:
- c1) dac subarborele stng este vid (v^.fius=nil), atunci
adresa vrfului v este memorat ntr-o celul suplimentar
aux, v devine fiul dreapta al lui v, iar celula aux este
eliberat din memorie (este disponibilizat celula
corespunztoare vrfului din arbore de informaie nr);
- c2) dac subarborele stng este nevid, atunci se determin
cel mai mare element din subarborele stng (este parcurs
subarborele stng pe legturile din dreapta, ct timp acest
lucru este posibil, cu pstrarea i a adresei nodului printe
corespunztor fiecrui vrf atins) :
p:=v^.fius;
while p^.fiud<> nil do
begin
p1:=p;
p:=p^.fiud;
end;
c2.1) dac fiul stnga al lui v nu are subarbore drept
(v^.fius^.fiud=nil), atunci informaia ataat fiului stnga se
transfer n vrful curent, iar fiul stnga (v^.fius) este
nlocuit cu fiul su stnga (v^.fius^.fius) i este eliberat
memoria corespunztoare celulei v^.fius.
c2.2) altfel, se transfer n rdcin informaia ataat
ultimului nod p determinat la c2), nodul p este nlocuit cu
fiul su stng i celula corespunztoare lui p este eliberat
din memorie.

Exemple:
4.15. tergerea informaiei 70 n arborele de sortare din exemplul 4.12 este
realizat astfel:
70>50, decide tergerea din subarborele drept (cu rdcin 70) - situaia 2.b;
70=70, decide tergerea din arborele curent: rdcina etichetat cu 70 -
situaia 2.c;
Structuri arborescente
Exist subarbore stng (rdcina lui p este etichetat cu 60) iar acesta nu are
subarbore drept - situaia 2.c.1.: nodul cu informaie 70 este etichetat cu 60, iar p este
nlocuit cu subarborele su stng (vid)
Arborele de sortare rezultat este:













4.16. tergerea informaiei 30 din arborele de sortare:



















este realizat astfel:
30>50, decide tergerea din subarborele stng (cu rdcin 30) - situaia 2.a;
30=30, decide tergerea din arborele curent: rdcina etichetat cu 70
situaia 2.c;
30
60
20
40
90
80
50
30
70
20 40
60
90
25
50
10
24
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
Exist subarbore stng (rdcina este etichetat cu 20), iar acesta are
subarbore drept - situaia 2.c.2: nodul cu informaie 30 este etichetat cu 25
(informaia ultimului nod p detectat la c2)), iar p este nlocuit cu subarborele su
stng (cu rdcin 24).
Arborele rezultat este:















Punctul c) de la pasul 2 poate fi nlocuit cu:
c) dac INF(v)=nr atunci:
- c1) dac subarborele drept este vid (v^.fiud=nil), atunci adresa
vrfului v este memorat ntr-o celul suplimentar aux, v devine fiul stnga al lui v,
iar celula aux este eliberat din memorie (este eliberat vrful de informaie nr);
- c2) dac subarborele drept este nevid, atunci se determin cel mai
mic element din subarborele drept (este parcurs subarborele drept pe legturile din
stnga, ct timp acest lucru este posibil, cu pstrarea i a adresei nodului printe
corespunztor fiecrui vrf atins) :
p:=v^.fiud;
while p^.fius<> nil do
begin
p1:=p;p:=p^.fius;
end;
c2.1.) dac fiul dreapta al lui v nu are subarbore stng
(v^.fiud^.fius=nil), atunci informaia ataat fiului dreapta se
transfer n vrful curent, iar fiul dreapta este nlocuit cu fiul
su dreapta (v^.fiud^.fiud) i este eliberat memoria
corespunztoare celulei v^.fiud.
c2.2) altfel, se transfer n rdcin informaia ataat
ultimului nod p determinat la c2), nodul p este nlocuit cu
fiul su dreapta i celula corespunztoare lui p este eliberat
din memorie.
25
70
20 40
60
90
10
50
24
Structuri arborescente
4.2.3 Arbori de structur

Expresiile aritmetice n care intervin numai operatori binari pot fi
reprezentate prin intermediul arborilor strict binari (fiecare nod neterminal are doi
fii). Un arbore de structur are vrfurile etichetate astfel:
- fiecare nod neterminal este etichetat cu un simbol corespunztor unuia
dintre operatori;
- fiecare nod terminal este etichetat cu un operand (variabil sau constant);
Construcia arborelui de structur corespunztor unei expresii aritmetice date
se realizeaz pe baza parantezrii existente n expresie i a prioritilor
convenional asociate operatorilor (ordinea operaiilor) astfel nct rdcina fiecrui
subarbore este etichetat cu operatorul care se execut ultimul n evaluarea
subexpresiei corespunztoare acelui subarbore.

Exemplu:
4.17. Pentru expresia matematic (a+b)*(c-d)+e/g, arborele de structur este:


















Construcia arborelui de structur pentru o expresie s se face n dou etape, i
anume:
1. Ataarea prioritilor operatorilor i operanzilor (toi operanzii
au aceeai prioritate, egal cu prioritatea maxim). Prioritile ataate
permit eliminarea parantezelor fr ca semnificaia expresiei s se
modifice;
2. Construcia propriu-zis.
/
+

e
g
b
+
a c d
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
Prima etap este realizat astfel:
- prioritatea iniial a operatorilor +,- este 1 (dac expresia nu conine
paranteze, atunci n construcie operatorii vor fi primii luai n considerare,
n ordinea de la dreapta la stnga);
- prioritatea iniial a operatorilor /,* este 10 (dac expresia nu conine
paranteze, acetia sunt considerai dup operatorii de prioritate 1 n
ordinea de la dreapta la stnga);
- prioritatea fiecrui operator este incrementat cu valoarea 10 pentru
fiecare pereche de paranteze n interiorul crora se afl;
- prioritatea ataat fiecrui operand este maxint.
Dup stabilirea sistemului de prioriti, se elimin parantezele din expresie
(ordinea de efectuare a operaiilor n cadrul expresiei este indicat de vectorul de
prioriti ataat).

Exemplu:
4.18. Etapele calculului sistemului de prioriti pentru expresia de la
exemplul 4.17 sunt:

i j dim vectorul prioritate
1 10 0
2 10 1 (maxint)
3 10 2 (maxint,11)
4 10 3 (maxint,11,maxint)
5 0 3 (maxint,11,maxint)
6 0 4 (maxint,11,maxint,10)
7 10 4 (maxint,11,maxint,10)
8 10 5 (maxint,11,maxint,10,maxint)
9 10 6 (maxint,11,maxint,10,maxint,11)
10 10 7 (maxint,11,maxint,10,maxint,11,maxint)
11 0 7 (maxint,11,maxint,10,maxint,11,maxint)
12 0 8 (maxint,11,maxint,10,maxint,11,maxint,1)
13 0 9 (maxint,11,maxint,10,maxint,11,maxint,1,maxint)
14 0 10 (maxint,11,maxint,10,maxint,11,maxint,1,maxint,10)
15 0 11 (maxint,11,maxint,10,maxint,11,maxint,1,maxint,10,maxint)

Dup eliminarea parantezelor, expresia rezultat este s=a+b*c-d+e/g, avnd
ca vector de prioriti (maxint,11,maxint,10,maxint,11,maxint,1,maxint,10,maxint).

Construcia arborelui de structur pe baza expresiei s, din care au fost
eliminate parantezele i a vectorului de prioriti, poate fi realizeaz recursiv n
modul descris n continuare. La momentul iniial expresia curent este cea dat.
Structuri arborescente
- Pentru expresia curent se determin operatorul/operandul de prioritate
minim care se ataeaz ca etichet a rdcinii r a subarborelui de
structur corespunztor ei; fie i poziia acestuia n cadrul expresiei;
- Dac expresia are un singur simbol (operand) atunci r^.fius=r^.fiud=nil;
- Altfel, se consider subexpresiile s1 i s2, constnd din simbolurile de pe
poziiile 1 pn la i-1 i respectiv i+1 pn la length(s). Arborii de
structur corespunztori subexpresiilor s1 i s2 se ataeaz ca subarbore
stng, respectiv subarbore drept vrfului r.

Exemplu:
4.19. Pentru expresia de la exemplul 4.17, dup determinarea vectorului de
prioriti i a expresiei neparantezate corespunztoare, procedura cr_der realizeaz
urmtoarea construcie:

s=a+b*c-d+e/g,
prioritate=(maxint,11,maxint,10,maxint,11,maxint,1,maxint,10,maxint)

p=1,u=11 min=1, i=8, arborele:









p=1,u=7 min=10, i=4, arborele:













+



n construcie n construcie

+



* n construcie


n construcie n construcie
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
p=1,u=3 min=11, i=2, arborele:




















p=u=1 min=maxint, i=1, arborele:





















+
+
n construcie
n construcie
n construcie a

+
+
n construcie
n construcie
n construcie n construcie
Structuri arborescente

p=3,u=3 min=maxint, i=3, arborele:



















p=5,u=7 min=11, i=6, arborele:





















+
+
n construcie
n construcie
a
b

+
+
n construcie
n construcie
a
b

n construcie
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
p=5,u=5 min=maxint, i=5, arborele:




















p=7,u=7 min=maxint, i=7, arborele:




















+
+
n construcie
n construcie
a
b

c

+
+
n construcie
a
b

c
d
Structuri arborescente
p=9,u=11 min=10,i=10, arborele:




















p=9,u=9 min=maxint,i=9, arborele:





















+
+
n construcie
a
b

c d
/
n construcie

+
+
a
b

c d
/
n construcie
e
Programarea calculatoarelor Tehnica programrii n limbajul Pascal
p=11,u=11 min=maxint,i=11, arborele:


















i construcia se termin.


Construcia arborelui de structur se face n ipoteza n care expresia este
corect. Procedura cr_der se apeleaz cu:nil,1,length(s),s,prioritate, unde s i
prioritate sunt cei rezultai dup apelarea procedurii prioriti.

Definiia 4.2.5. Se numete forma polonez direct a unei expresii, expresia
rezultat n urma parcurgerii RSD a arborelui de structur. . Se numete forma
polonez invers a unei expresii, expresia rezultat n urma parcurgerii SDR a
arborelui de structur.

Exemplu:
4.20. Pentru expresia considerat la exemplul 4.17, forma polonez direct
este +*+ab-cd/eg. Forma polonez invers a expresiei date este ab+cd-*eg/+.

Parcurgerea arborelui n inordine determin secvena de simboluri rezultat
prin eliminarea parantezelor din expresia dat. Restaurarea unei forme parantezate
poate fi realizat printr-o parcurgere SRD n modul urmtor. La momentul iniial,
vrful curent este rdcina arborelui de structur. Dac vrful curent v nu este vrf
terminal, atunci se genereaz (s1) eticheta(v) (s2), unde eticheta(v) este operatorul
etichet a vrfului, s1 este secvena rezultat prin traversarea SRD a subarborelui
stng, s2 este secvena rezultat prin traversarea SRD a subarborelui drept. Dac v
este vrf terminal, atunci este generat secvena eticheta(v).

+
+
a
b

c d
/
e g
Structuri arborescente
Exemplu:
4.21. Prin aplicarea traversrii SRD a arborelui de structur al expresiei din
4.2.6, rezult:
s=(((a)+(b))*((c)-(d)))+((e)/(g)).
Se observ c, prin aplicarea traversrii SRD i a parantezrii descrise,
expresia rezultat are aceeai semnificaie cu expresia iniial, dar apar multe
paranteze inutile. Propunem ca exerciiu scrierea unei proceduri Pascal pentru
eliminarea parantezelor inutile.

Evaluarea expresiilor aritmetice pe baza arborilor de structur

Traversarea SRD a arborelui de structur ataat unei expresii aritmetice
permite evaluarea expresiei pentru valorile curente corespunztoare variabilelor.
Evaluarea poate fi efectuat n mod recursiv. La momentul iniial, vrful curent este
rdcina arborelui. Dac v este vrf curent, atunci noua informaie asociat lui v este:
- val(eticheta(v)), dac v este vrf terminal;
- val(s1)eticheta(v)val(s2), dac v este neterminal,
unde val(s1), val(s2) sunt valorile rezultate prin evalurile subarborilor stng
i respectiv drept ai lui v; val(eticheta(v)) este valoarea curent a variabilei, dac
eticheta lui v este variabil, respectiv valoarea constantei, dac eticheta lui v este o
constant.
Dac v este vrf neterminal, atunci noua informaie asociat lui v este
val(s1)eticheta(v)val(s2), ce reprezint rezultatul operaiei eticheta(v) aplicat
valorilor val(s1), val(s2).

Exemplu:
4.22. Prin aplicarea metodei de evaluare descrise, se obine:
















15
5
18
3
2
3
5 2
3
6 2

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