Documente Academic
Documente Profesional
Documente Cultură
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
In acest exemplu rdcina arborelui este Bob Smith. Este rdcin deoarece nu are
nici un printe. Copilul su direct este Tina Jones.
Tina Jones are 3 noduri copii (nodurile de pe nivelul urmtor din ierarhie): Jisun Lee,
Frank Mitchell i Davis Johnson. Printele su este Bob Smith (nodul de pe nivelul superior,
din ierarhie).
Toi arborii au urmtoarele proprieti:
Exist o singur rdcin
Toate nodurile, cu excepia rdcinii, au exact un singur printe
Nu exist cicluri. Aceasta nseamn c pornind de la un anumit nod, nu exist
un anumit traseu pe care l putem parcurge, astfel nct s ajungem napoi la nodul
de plecare.
Arbori Binari
Arborii binari sunt un tip aparte de arbori, n care fiecare nod are maxim 2 copii.
Pentru un nod dat, ntr-un arbore binar, vom avea copilul din stnga, i copilul din dreapta.
Exemplu de arbori binari:
1
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
Arborele din figura a) are 8 noduri, nodul 1 fiind rdcina. Acesta are ca i copil
stnga nodul nr.2, iar ca i copil dreapta nodul nr.3. La rndul su nodul nr.2 nu are dect un
singur copil (stnga), i anume nodul nr 4.
Deci un nod dintr-un arbore binar poate avea 2 copii (stnga i dreapta), un singur
copil (doar stnga sau doar dreapta) sau nici unul (exemplu nodul 8).
Nodurile care nu au nici un copil se numesc noduri frunz.
Nodurile care au 1 sau 2 copii se numesc noduri interne.
Pentru reinerea informaiei n calculator se va folosi alocarea dinamic. Deoarece
pentru fiecare nod n parte este necesar s se rein, pe lng informaia util i legturile cu
nodurile copii (adresele acestora), ne putem imagina urmtoarea structura a unui nod:
leg_st
inf
struct Nod {
int inf;
Nod *leg_st;
Nod *leg_dr;
};
Nod *prim;
leg_dr
unde: leg_st reprezint adresa nodului copil din stnga, inf reprezint cmpul cu
informaie util, iar leg_dr este legtura cu copilul din dreapta.
Un arbore binar va avea urmtoarea structur intern:
adr1 leg_st
adr2 leg_st
leg_st
inf
leg_dr
inf
inf
leg_dr
adr5 leg_st
leg_dr
adr3 leg_st
inf
leg_dr
nivel 1
inf
leg_dr
nivel 2
nivel 3
Pe nivelul 1 vom avea un singur nod, nodul rdcin. Componenta leg_st va fi egal
cu adresa adr2, nodul din stnga de pe nivelul 2, iar componenta leg_dr va fi egal cu adresa
adr3.
Componentele leg_st i leg_dr ale nodului din stnga de pe nivelul 2, vor fi egale cu
adr4, respectiv adr5.
2
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
Nodul din dreapta de pe nivelul 2 nu mai are nici un copil i de aceea componentele
sale leg_st i leg_dr vor avea valoarea NULL (ca i la liste dinamice).
n mod analog i componentele leg_st i leg_dr ale nodurilor de pe nivelul 3 vor avea
valoarea NULL.
3
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
4
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
Prin crearea unui arbore binar de cutare (A.B.C.) vom nelege de fapt crearea
rdcinii, restul nodurilor fiind adugate prin operaia de inserare.
Implementare :
//programul va primi ca parametru numrul pe care trebuie s l adauge
void insertie(int nr)
{
Nod *nod1, *nod2, *nod3;
5
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
6
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
Parcurgerea n inordine
Parcurgerea n inordine presupune vizitarea mai nti a copilului din stnga, apoi vizitarea
rdcinii i mai apoi a copilului din dreapta.
Pentru arborele anterior, se procedeaz astfel:
1. se pornete de la rdcina 90. Pentru aceasta se viziteaz mai nti copilul din stnga,
nodul 50. Si acesta este la rndul lui o rdcin pentru arborele 20 - 75. De aceea vom
vizita mai intai copilul su stng, nodul 20, care la rndul su este rdcin pentru
arborele 5 25. Vom vizita mai nti copilul stng, nodul 5.
2. pentru nodul 5 nu mai avem ce vizita. Revenim la rdcina 20, pentru care tocmai am
vizitat subarborele stng. Conform definiiei, o vizitm pe ea.
3. vizitm nodul 25, copilul su drept.
4. revenim la rdcina 20. Nu mai avem ce vizita pe acest nivel. Urcm la rdcina 50.
Pentru aceasta am vizitat subarborele stng. Este rndul ei s o vizitm.
5. Vom vizita apoi subarborele ei drept, dup modelul anterior
..
n final vom obine parcuregerea:
5 20 25 50 66 75 80 90 92 95 111 150 166 175 200
Se observ faptul c parcurgerea n inordine va afia de fapt vectorul ordonat cresctor.
void Inordine(Nod* rad)
{
//dac nu s-a ajuns la ultimul nod
if (rad != NULL) {
// se viziteaz copilul din stnga
Inordine(rad->leg_st);
//se viziteaz rdcina
printf( %d - ,rad->inf);
//se viziteaz copilul din dreapta
Inordine(rad->leg_dr);
}
}
Parcurgerea n postordine
Pentru parcurgerea n postordine, se va vizita mai nti subarborele stng, apoi
subarborele drept i de abia ultima dat rdcina.
Care este vectorul returnat de aceast parcurgere?
Implementai algoritmul!
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
Cazul II
Dorim s tergem nodul 150.
Subarborele drept nu conine dect
nodul 175 Nu exist un subarbore
stng al subarborelui drept.
Se va nlocui nodul 150 cu 175.
Cazul III
Dorim s tergem nodul 50.
Deoarece subarborele drept al
nodului 50 conine un subarbore
stng, se va alege cel mai din stnga
nod al subarborelui drept a lui 50.
Acest cel mai din stnga nod va
conine cel mai mic numr mai mare
dect nodul de ters. In cazul nostru
acest nod este 66.
8
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
if (tmp1->leg_dr==NULL){
//mutare inf din nodul din st, in nodul curent
tmp1->inf=tmp1->leg_st->inf;
//refacere legturi
tmp1->leg_st = tmp1->leg_st->leg_st;
delete tmp1->leg_st;
}
else
//nu avem copil stnga
if (tmp1->leg_st == NULL){
//mutare inf din nodul din st, in nodul curent
tmp1->inf=tmp1->dr->inf;
tmp1->dr = tmp1->dr->dr;
delete tmp1->dr;
}
//cazul III
else {
//mergem la copilul din dreapta
tmp = tmp1->leg_dr;
tmp2 = tmp1;
//cutm cel mai din stnga copil
while (tmp->leg_st != NULL)
{
tmp2 = tmp;
tmp = tmp->leg_st;
}
tmp1->inf = tmp->inf;
tmp2->leg_st = NULL;
delete tmp;
}//end else
return 0;
}
Probleme propuse
1. Implementai operaiile de adugare, tergere din arbore, cutare i parcurgere prin toate
trei metodele, folosind doar funcii recursive. Implementai o funcie de parcurgere care
sa returneze sirul ordonat descresctor. (a nu se ordona vectorul dup ce s-a fcut
parcurgerea)
2. Implementai operaiile de adugare n arbore (recursiv), tergere din arbore (nodul de
ters se va nlocui cu cel mai din dreapta nod al subarborelui stng al nodului de ters) i
parcurgere Parcurgerea se va face printr-o metod care s returneze sirul ordonat
descresctor.
3. Implementai un arbore unde fiecare nod are maxim 3 copii, aranjai dup urmtoarea
regul:
copilul din stnga este mai mic dect jumatate din nodul rdcin (nod x <
rdcin/2)
nodul din dreapta are informaia > dect informaia din rdcin
9
PDF created with pdfFactory Pro trial version www.pdffactory.com
Tehnici de Programare
9. Arbori
Udritoiu Stefan
Stoica Spahiu Cosmin
4. Evidena produselor aflate n stocul unui magazin se ine ntr-un arbore de cutare. Pentru
fiecare nod se reine: denumire produs, pre, cantitate. n fiecare sear arborele este
actualizat prin comenzi de forma:
i se mai introduc produse primite de la depozit (Atenie: un astfel de produs este
posibil s se mai afle n stoc)
s se terg produsele vndute n ziua respectiv
v se tiprete valoarea tuturor produselor aflate pe stoc
L se tiprete o list cu toate produsele aflate pe stoc
5. Se citesc de la tastatur n numere naturale care se adaug pe msur ce se citesc ntr-o
stiv (implementat dinamic). S se adauge aceste numere ntr-un arbore binar de cutare.
6. Definim un arbore de cutare pentru numere complexe, n care fiecare nod va conine ca
informaie util partea real i partea imaginar a unui numr complex de forma x + iy. S se
creeze un arbore binar de cutare care s memoreze n numere complexe citite de la tastatur,
apoi s se scrie o funcie care s tearg din arbore numerele complexe care au partea real i
partea imaginar egal.
7. Un arbore binar de cutare se numete AVL dac pentru orice nod, diferena dintre
nlimea subarborelui stng i a subarborelui drept este -1, 0 sau 1 (nlimea reprezint
numrul de nivele). S se construiasc un arbore AVL care s aib n noduri cheile 1, 2, n.
Indicaie: s se foloseasc un algoritm Divide et Impera. La fiecare pas al procedurii
recursive de creare se introduce n arbore un subinterval al mulimii {1,2 n} cuprins ntre
{stm} iar apoi {m+1, dr}, cu m = (st + dr)/2
8.
10
PDF created with pdfFactory Pro trial version www.pdffactory.com