Sunteți pe pagina 1din 7

APLICAII ELEMENTARE CU ARBORI

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.

REPREZENTAREA ARBORILOR CU RDCIN


Prin structuri de date nlnuite.
Reprezentarea fiecrui nod al arborilor printr-un obiect. Pointerii ctre celelalte noduri pot varia
n funcie de tipul arborelui.

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.

Reprezentarea standard presupune memorarea pointerilor pentru printe, pentru descendentul

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.

Arbori cu rdcin cu numr nelimitat de ramuri


Schema reprezentrii arborilor binari poate fi extins la orice clas de arbori n care numrul de
descendeni ai fiecrui nod nu depete o constant k (din motive de alocare i reprezentare).

Dac numrul descendenilor este mrginit de o constant mare i majoritatea nodurilor au un


numr mic de descendeni se va irosi mult memorie.

Reprezentarea descendent-stng, frate-drept - schem "inteligent" pentru folosirea arborilor


binari la reprezentarea arborilor cu numr arbitrar de descendeni.
Utilizeaz un spaiu de O(n) pentru orice arbore cu rdcin i cu n noduri.
Fiecare nod conine un pointer spre printe p.
Nu exist dect doi pointeri spre descendeni: fiu-stng[x] refer cel mai din stnga
descendent al nodului x i frate-drep[x] refer fratele lui x, cel mai apropiat spre dreapta.
Dac nodul x nu are descendeni atunci fiu-stng[x] = NIL, iar dac nodul x este cel mai din
dreapta descendent al printelui su atunci frate-drept[x] = NIL.
Computer Science and Electrical Engineering Department
Adrian FLOREA

Alte reprezentri ale arborilor


Prin ansambluri (heap - arbore binar complet ntr-un singur tablou plus un indice.
Prin pstrarea doar a pointerilor spre prini; nu exist pointeri spre descendeni. Arborii sunt
traversai numai spre rdcin.

ARBORI BINARI DE CUTARE


Sunt structuri de date nlnuite (n care fiecare nod este un obiect) organizate sub form de
arbori binari ce posed multe operaii specifice mulimilor dinamice (CAUT, MINIM,
MAXIM, PREDECESOR, SUCCESOR, lNSEREAZ i TERGE).
Operaiile de baz pe arborii binari consum un timp proporional cu nlimea arborelui. Pentru
un arbore binar complet cu n noduri, aceste operaii se execut n cazul cel mai defavorabil ntrun timp O(lgn).
nlimea unui arbore binar de cutare construit aleator este O(lgn).

Ce este un arbore binar de cutare?


Fiecare obiect (nod al arborelui binar de cutare) conine cmpurile:

cheie i date adiionale.


Subarbore stng, subarbore drept i printe care refer spre nodurile corespunztoare fiului
stng, fiului drept i respectiv printelui nodului. Dac un fiu sau un printe lipsete, cmpul
corespunztor acestuia va conine valoarea NIL. Nodul rdcin este singurul nod din arbore
care are valoarea NIL pentru cmpul printe p.
Cheile sunt ntotdeauna astfel memorate nct ele satisfac proprietatea arborelui binar de
cutare: cheia oricrui nod din subarborele stng este mai mic sau egal dect cheia din
rdcin care este la rndul ei mai mic sau egal dect cheia oricrui nod din subarborele
drept.
Proprietatea arborelui binar de cutare permite tiprirea tuturor cheilor n ordine cresctoare
folosind un algoritm recursiv simplu (traversarea arborelui n in-ordine - cheia rdcinii unui
arbore se tiprete ntre valorile din subarborele su stng i cele din subarborele su drept).
Exist alte dou tipuri de parcurgeri ale arborilor binari de cutare: pre-ordine i post-ordine.

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])

Cutare recursiv - n arbore binar de cutare


Folosit la cutarea unui nod avnd cheia cunoscut, intr-un arbore binar de cutare. Se cunoste
pointerul x la rdcina arborelui i valoarea k a cheii cutate. ARBORE-CAUT returneaz un
pointer la nodul avnd cheia k dac exist un astfel de nod n arbore sau NIL n caz contrar.

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)

Cutare iterativ - n arbore binar de cutare


ARBORE-CAUT-ITERATIV(x, k)
1: ct timp x NIL i k cheie[x] execut
2:
dac k < cheie[x] atunci
3:
x stnga[x]
4:
altfel
5:
x dreapta[x]
6: returneaz x

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

Succesorul i predecesorul unui nod


Cunoscnd un nod dintr-un arbore binar de cutare, este important uneori determinarea
succesorului su n ordinea de sortare determinat de traversarea n inordine a arborelui (n cazul
tergerii din arbore a unui nod avnd ambii fii, pentru realizarea legturilor).
Dac toate cheile sunt distincte, succesorul nodului x este nodul avnd cea mai mic cheie mai
mare dect cheie[x]. Structura de arbore binar de cutare permite determinarea succesorului unui
nod chiar i fr compararea cheilor.
ARBORE-SUCCESOR trateaz dou alternative: dac subarborele drept al nodului x nu este
vid, atunci succesorul lui x este chiar cel mai din stnga nod din acest subarbore drept. n cellalt
caz, cnd subarborele drept al nodului x este vid i x are un succesor y, atunci y este cel mai de
jos strmo al lui x al crui fiu din stnga este de asemenea strmo al lui 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

Teorema: Pe un arbore binar de cutare de nlime h, operaiile pe mulimi dinamice CAUT,


MINIM, MAXIM, SUCCESOR i PREDECESOR se pot executa ntr-un timp O(h).

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;

struct nod *creare(void); crearea recursiv a arborelui: nti


informaiacurent,apoicreareasubarborelui
stnginfinalaceluidrept.
structnod*creare(void){

structnod*p;

printf("\nIntroducetiinformatia:");

p=(structnod*)malloc(sizeof(structnod));

scanf("%d",&p>inf);

p>st=p>dr=NULL;

printf("\n\nDoriti introducerea subarborelui


stang(d/n)?");

if(getche()!='n')p>st=creare();

puts("\n\nDoriti introducerea subarborelui


drept(d/n)?");

if(getche()!='n')p>dr=creare();

return(p);
}

void parcurgere_preord(struct nod *p); parcurgerea n preordine a


arborelui: nti se afieaz /
analizeaz
rdcina,
apoi
subarborele stng apoi cel
drept.

void parcurgere_inordine(struct nod *p); parcurgerea n ordine a


arborelui: nti se afieaz / analizeaz subarborele
stng,apoirdcinainfinalsubarboreledrept.

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.

void citesteMA(int[100][100],int &); citirea din fiier a listei de


muchii i transformarea n matrice de adiacen i
obinereanumruluidenodurialgrafului.
Computer Science and Electrical Engineering Department
Adrian FLOREA

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.

Computer Science and Electrical Engineering Department


Adrian FLOREA

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