Documente Academic
Documente Profesional
Documente Cultură
I.
CONSIDERAII TEORETICE
Din punct de vedere etimologic termenul de arbore a fost introdus de ctre matematicianul
Arthur Cayley n 1857, plecnd de la o analogie botanic. Structurile arborescente reprezint
structuri neliniare de date cu aplicaii n programare, care exprim relaii de ramificare ntre
noduri, asemntoare configuraiei arborilor din natur, cu deosebirea c n informatic arborii
cresc n jos (au rdcin n vrf). Se numete arbore un graf conex i fr cicluri.
Arbori binari
Definiie: Un arbore binar este o mulime finit de noduri care este fie vid, fie reprezint un arbore
ordonat n care fiecare nod are cel mult doi descendeni (stng i drept).
Un nod fr descendeni se numete nod terminal sau frunz. Un arbore binar n care fiecare nod
care nu este terminal are exact doi descendeni se numete arbore binar complet.
Un arbore binar complet care are n noduri terminale, toate situate pe acelai nivel, are n total 2n-1
noduri.
stng i descendentul drept al fiecrui nod din arbore. Dac rdcin(T) = NIL (sau NULL)
arborele este vid. Rdcin se afl pe nivelul 0 al arborelui.
Reprezentarea prin vector de TAI i eventual prin vector de DESCENDENI. Vectorul TAT
precizeaz pentru fiecare vrf i nodul TAT[i], care reprezint printele su n arbore (rdcina
subarborelui de care aparine). Vectorul DESCENDENI indic prin valoarea -1 sau +1 dac
vrful i este descendentul stng sau drept al printelui su TAT[i]. Pentru rdcina arborelui
TAT[rdcin]=0 i DESCENDENI[rdcin]=0.
ARBORE-TRAVERSARE-INORDINE(x)
1: dac x NIL atunci
2:
ARBORE-TRAVERSARE-INORDINE(stnga[x])
3:
afieaz cheie[x]
4:
ARBORE-TRAVERSARE-INORDINE(dreapta[x])
ARBORE-CAUT(x, k)
1: dac x = NIL sau k = cheie[x] atunci
2:
returneaz x
3: dac k < cheie[x] atunci
4:
returneaz ARBORE-CAUT(stnga[x], k)
5: altfel
Computer Science and Electrical Engineering Department
Adrian FLOREA
6:
returneaz ARBORE-CAUT(dreapta[x], k)
Minimul i maximul
Determinarea elementului avnd cheia minim dintr-un arbore binar de cutare se realizeaz
ntotdeauna urmnd pointerii fiu stnga ncepnd cu rdcina i terminnd cnd se ntlnete
NIL.
Pentru determinarea elementului de cheie maxim se procedeaz simetric.
ARBORE-MINIM(x)
1: ct timp stnga[x] NIL execut
2:
x stnga[x]
3: returneaz x
ARBORE-MAXIM(x)
1: ct timp dreapta[x] NIL execut
2:
x dreapta[x]
3: returneaz x
ARBORE-SUCCESOR(x)
1: dac dreapta[x] NIL atunci
2:
returneaz ARBORE-MINIM(dreapta[x])
3: y p[x]
4: ct timp y NIL i x = dreapta[y] execut
5:
xy
6:
y p[y]
7: returneaz y
Computer Science and Electrical Engineering Department
Adrian FLOREA
Inserarea i tergerea
Provoac modificarea mulimii dinamice reprezentat de arborele binar de cutare. Structura de
date trebuie modificat n sensul c ea trebuie pe de o parte s reflecte inserarea sau tergerea, iar
pe de alt parte s conserve proprietatea arborelui binar de cutare.
Inserarea unui element nou - relativ simpl, pe cnd gestiunea tergerii unui element este mai
complicat.
Inserarea
ARBORE-INSEREAZ primete ca parametrii arborele binar de cutare T i nodul z pentru
care cheie[z] = v (valoarea de inserat), stnga[z] = NIL i dreapta[z] = NIL.
ARBORE-INSEREAZ(T, z)
1: y NIL
2: x rdcin[T]
3: ct timp x NIL execut
4:
yx
5:
dac cheie[z] < cheie[x] atunci
6:
x stnga[x]
7:
altfel
8:
x dreapta[x]
9: p[z] y
10: dac y = NIL atunci
11:
rdcin[T] z
t2: altfel dac cheie[z] < cheie[y] atunci
13:
stnga[y] z
14:
altfel
15:
dreapta[y] z
tergerea
ARBORE-TERGE primete ca argument un pointer la z (nodul care va fi ters).
Distingem trei situaii:
Dac z nu are fii, se va modifica printele su p[z] pentru a-i nlocui fiul z cu NIL.
Dac nodul are un singur fiu, z va fi eliminat din arbore prin inserarea unei legturi de la
printele lui z la fiul lui z.
Dac nodul are doi fii, se va elimina din arbore succesorul y al lui z, care nu are fiu stng i
apoi se vor nlocui cheia i datele adiionale ale lui z cu cheia i datele adiionale ale lui y.
ARBORE-TERGE(T, z)
1: dac stnga[z] = NIL sau dreapta[z] = NIL atunci
2:
yz
3: altfel
4:
y ARBORE-SUCCESOR(z)
5: dac stnga[y] NIL atunci
Computer Science and Electrical Engineering Department
Adrian FLOREA
6:
x stnga[y]
7: altfel
8:
x dreapta[y]
9: dac x NIL atunci
10:
p[x] p[y]
11: dac p[y] = NIL atunci
12:
rdcin[T] x
13: altfel dac y =stnga[p[y]] atunci
14:
stnga[p[y]] x
15:
altfel
16:
dreapta[p[y]] x
17: dac y z atunci
18:
cheie[z] cheie[y] se copiaz i datele adiionale ale lui y
19: returneaz y
II. APLICAII
II.1. Scriei un program care folosete o abordare recursiv i alocare dinamic pentru
descrierea operaiilor aferente arborilor binari.
a) Creare arbore.
b) Calcularea numrului de noduri (chei din arbore).
c) tergerea ntregului arbore.
d) Cutarea unui element n arbore.
e) Parcurgerea arborelui n preordine (SDR), inordine (SRD), postordine (RSD)
f) Determinarea elementului minim i maxim din arbore.
g) Suma elementelor pare din arbore.
h) Afiarea tuturor numerelor prime din arbore.
i) Listarea nodurilor aflate pe un anumit nivel n arbore.
j) Determinarea adncimii maxime a unui arbore binar (adic al numrului de nivel maxim
asociat nodurilor terminale) i a elementelor de pe calea respectiv.
k) Verificarea dac un arbore primit ca parametru reprezint un arbore binar de cutare
(S<R<D).
II.2. Scriei un program care implementeaz operaiile aferente arborilor binari de cutare
(CAUT, MINIM, MAXIM, PREDECESOR, SUCCESOR, lNSEREAZ i TERGE)
folosind funciile descrise n prezentul document.
II.3. Scriei un program care pornind de la un graf neorientat determin dac este arbore.
Abordare cu STL (ablonul queue <int>q;).
Se citete dintr-un fiier pe cte o linie separat numrul de noduri i perechile de noduri ntre
care exista o muchie. Practic se verific nti dac numrul de noduri este cu unul mai mult
dect numrul de muchii (condiie necesar dar nu i suficient). Dac numrul de muchii este
mai mare sau egal dect numrul de muchii nseamn c sigur exist un ciclu n graf, motiv
pentru care graful nu este arbore. Condiia de suficien este realizat dac graful este conex.
Acest lucru se verific prin parcurgerea grafului n lime: se introduce ntr-o coad primul nod
i de la acesta se parcurg muchiile incidente cu alte noduri. Nodurile adiacente (vizitate) se
introduc n coad pentru a fi parcurse muchiile incidente acestora altele dect cele anterior
parcurse. Dup analiza unui nod (verificarea adiacenei cu toate celelalte noduri) acesta se
Computer Science and Electrical Engineering Department
Adrian FLOREA
scoate din coad. Dac se golete coada se verific dac au fost vizitate toate nodurile caz n
care graful este conex, i ajungnd n acest punct (nu conine cicluri) el este arbore.
Se consider structura de date i prototipurile urmtoarelor funcii:
structnod{intinf;
structnod*st,*dr;
}*cap,*p;
structnod*p;
printf("\nIntroducetiinformatia:");
p=(structnod*)malloc(sizeof(structnod));
scanf("%d",&p>inf);
p>st=p>dr=NULL;
if(getche()!='n')p>st=creare();
if(getche()!='n')p>dr=creare();
return(p);
}
voidparcurgere_postordine(structnod*p);parcurgereanpostordinea
arborelui: nti se afieaz /
analizeaz subarborele stng,
apoi cel drept i n final
rdcina.
int numar_elemente(struct nod *p); numrul de elemente al unui arbore
este egal cu 1 + numrul de elemente
al subarborelui stng + numrul de
elementealsubarboreluidrept.
De asemenea, este necesar o variabil ajuttoare declarat global: int vizitat[100]; care
reine informaii despre vizitarea sau nu a unui nod din graf, precum i coada n care se introduc
nodurile queue<int>q;.
BIBLIOGRAFIE
[Iva98] Ivac C., Prun M. Bazele informaticii (Grafuri i elemente de combinatoric), Manual
pentru clasa a X-a, Editura Petrion, 1998.
[Cor90] Cormen, T. H., Leiserson, C. E., Rivest, R. L. Introduction to Algorithms. McGrawHill, New York, 1990.