Sunteți pe pagina 1din 44

Curs SDA (PC2)

Grafuri (continuare)
Iulian Nstac
2
Grafuri
Recapitulare
Definiie:
Un graf este o pereche
G = <V, M>
unde V este o mulime de vrfuri, iar
M VV este o mulime de muchii
(laturi).
3
De obicei muchia de la vrful a la vrful b
este notat cu:
- perechea ordonat (a, b) dac graful
este orientat;
- perechea neordonat {a, b} dac graful
este neorientat.
Observaie: S-a presupus c a i b sunt
diferite.
Recapitulare
4
Un graf poate fi:
- orientat,
- neorientat,
- mixt.
Recapitulare
5
Un drum este o succesiune de muchii de
forma:
- (a
1
, a
2
), (a
2
, a
3
), (a
3
, a
4
), ... , (a
n-1
, a
n
)
dac graful este orientat
- {a
1
, a
2
}, {a
2
, a
3
}, {a
3
, a
4
}, ... , {a
n-1
, a
n
}
dac graful este neorientat
Recapitulare
6
Definiii
Recapitulare
Lungimea unui drum = numrul de muchii care l
constituie.
Drum simplu = drum n care nici un vrf nu se
repet.
Ciclu = drum simplu cu excepia primului i
ultimului vrf care coincid.
Graf aciclic = graf fr cicluri.
7
Se numete subgraf al lui G un graf
G = <V, M>
unde V V, iar M M (M este o
mulime de muchii din M care unesc
vrfurile din V).
Recapitulare
8
Se numete graf parial al lui G un graf
G = <V, M>
unde M M (graful parial pstreaz
acelai numr de vrfuri V).
Recapitulare
9
Alte definiii
Recapitulare
Un graf (orientat sau neorientat) este
conex dac ntre oricare dou vrfuri
exist un drum posibil.
Un graf orientat este tare conex dac
ntre oricare dou varfuri i i j exist un
drum de la i la j i un drum de la j la i.
10
Pentru un graf neconex se pune problema
determinrii componentelor sale conexe.
Se numete component conex
(subgraf conex maximal) al unui graf, un
subgraf conex n care nici un vrf din
subgraf nu este unit cu unul din afar
printr-o muchia a grafului iniial.
Recapitulare
11
Putem ataa informaii pentru:
- vrfurile grafului (valori)
- muchii (lungimi sau costuri)
Recapitulare
12
Moduri de reprezentare a unui graf:
a. Matrice de adiacen
b. List de adiacen
c. List de muchii
13
Arbori
Definiia 1:
Arborele este un graf orientat,
aciclic i simplu conex.
14
Definiia 2:
Un arbore este un ansamblu
de structuri de date de natur
recursiv i dinamic.
15
Definiia 3:
Prin arbore nelegem o mulime finit i nevid
de elemente numite noduri:
ARB = { A1, A2, A3, ..., An } , unde n > 0 ,
care are urmtoarele proprieti:
- Exist un nod i numai unul care se numete
rdcina arborelui.
- Celelalte noduri formeaz submulimi disjuncte ale
lui ARB, care formeaz fiecare cte un arbore.
Arborii respectivi se numesc subarbori ai rdcinii.
16
Nodurile unui arbore
ntr-un arbore exist noduri crora nu le
mai corespund subarbori. Un astfel de nod
se numete terminal sau frunz.
n legtur cu arborii s-a stabilit un limbaj
conform cruia un nod rdacin se spune
c este un nod tat, iar subarborii
rdcinii sunt descendenii acestuia.
Rdcinile descendenilor unui nod tat
sunt fiii lui.
17
Nivel
Rdcina unui arbore are nivel 1 (sau 0)
Dac un nod se gsete la nivelul n,
atunci fii lui se gsesc n nivelul n+1.
18
Relaia de ordine
Dac exist o relaie de ordine ntre
subarborii oricrui nod al arborelui atunci
arborele este ordonat.
Pentru un nod al unui arbore ordonat se
noteaz rdcina primului subarbore ca
fiind fiul cel mai n vrst, iar rdcina
ultimului subarbore drept fiul cel mai tnr.
19
Un arbore ordonat este
echivalent unui arbore genealogic
n care rdcina arborelui este cel
mai vechi strmo cunoscut.
20
Arbori binari
Un arbore binar este o
mulime finit de elemente care
sau este vid, sau conine un
element numit rdcina, iar
celelalte elemente (dac exist)
se mpart n dou submulimi
disjuncte, care fiecare la rndul
ei, este un arbore binar.
21
Observaii:
Una din submulimi este numit
subarborele stng al rdcinii, iar
cealalt subarborele drept.
Arborele binar este ordonat, deoarece n
fiecare nod, subarborele stng se
consider c precede subarborele drept.
De aici rezult c un nod al unui arbore
binar are cel mult doi fii i c unul este fiul
stng, iar celalalt este fiul drept.
22
Fiul stng este considerat mai n vrst
dect cel drept.
Un nod al unui arbore binar poate s aib
numai un singur descendent. Acesta poate
fi subarborele stng sau subarborele
drept.
Observaii (continuare)
23
Observaii (continuare)
Cele dou posibiliti anterior menionate se
consider distincte.
Cu alte cuvinte, dac doi arbori binari difer
numai prin aceea c nodul V dintr-un arbore
are ca descendent numai fiul stng, iar
acelai nod echivalent, din cellalt arbore,
are ca descendent numai fiul drept, cei doi
arbori se consider distinci.
24
Particulariti
Un arbore binar nu se definete ca un caz
particular de arbore ordonat. Astfel, un
arbore nu este niciodat vid, spre
deosebire de un arbore binar care poate fi
i vid.
Orice arbore ordonat poate fi ntotdeauna
reprezentat printr-un arbore binar.
25
Modalitatea de transformare a unui
arbore ordonat ntr-un arbore binar
1. Se leag ntre ei fraii descendeni ai
aceluiai nod tat i se suprim legturile
lor cu nodul tat, cu excepia primului fiu.
2. Fostul prim fiu devine fiul stng al
nodului tat, iar ceilali foti frai
formeaz, n mod consecutiv, subarbori
drepi. Fiecare dintre fotii frai devine
descendent drept (fiu drept) al fostului
frate mai mare.
26
Utilizarea structurilor pentru
realizarea unui arbore binar
Nodul unui arbore binar poate fi reprezentat ca o
dat structural de tipul NOD care se definete n felul
urmtor:
typedef struct nod
{
declaratii ;
struct nod *st;
struct nod *dr;
} NOD;
unde:
st - este pointerul spre fiul stng al nodului curent;
dr - este pointerul spre fiul drept al aceluiai nod.
27
Asupra arborilor binari se pot defini
mai multe operaii:
1. inserarea unui nod frunz ntr-un arbore
binar;
2. accesul la un nod al unui arbore;
3. parcurgerea unui arbore;
4. tergerea unui arbore.
28
Operaiile de inserare i acces la un
nod, au la baz un criteriu care s
defineasc locul n arbore al nodului
n cauz.
Acest criteriu este dependent de
problema concret, la care se aplic
arborii binari, pentru a fi rezolvat.
29
Funcia criteriu
Definim o funcie pe care o vom denumi criteriu. Aceasta are
doi parametri care sunt pointeri spre tipul NOD.
Fie p1 primul parametru al funciei criteriu i p2 cel de-al
doilea parametru al ei. Atunci, funcia criteriu returneaz:
-1 - dac p2 pointeaz spre o dat de tip NOD care poate fi
un nod al subarborelui stng al nodului spre care pointeaz
p1;
1 - dac p2 pointeaz spre o dat de tip NOD care poate fi
un nod al subarborelui drept al nodului spre care pointeaz
p1;
0 - dac p2 pointeaz spre o dat de tip NOD care nu
poate fi nod al subarborilor nodului spre care pointeaz p1.
30
La construirea unui arbore se stabilete
un criteriu pentru determinarea poziiei n
care s se insereze n arbore nodul curent
(nodul corespunztor valorii curent citite).
31
Exemplu:
Considerm urmtorul ir de numere:
20, 30, 5, 20, 4, 30, 7, 40, 25, 28, ...
S se creeze un arbore n nodurile cruia vor fi trecute
numerele respective mpreun cu frecvena lor de apariie.
Practic nodurile acestui arbore vor avea dou cmpuri utile:
- primul care va conine numrul;
- cellalt care va conine frecvena de apariie a numrului.
32
Abordarea problemei:
a. p1 - este pointer spre un nod al arborelui n care se face
inserarea (iniial p1 pointeaz spre rdacina arborelui).
b. p2 - este un pointer spre nodul curent (nodul de inserat).
c. dac p2->val < p1->val, atunci se va ncerca inserarea
nodului curent n subarborele stng al nodului spre care
pointeaz p1.
d. dac p2->val > p1->val, atunci se va ncerca inserarea
nodului curent n subarborele drept al nodului spre care
pointeaz p1.
e. dac p2->val = p1->val, atunci nodul curent nu se mai
insereaz n arbore deoarece exist deja un nod
corespunztor valorii citite curent.
33
Nodul curent nu se mai insereaz n arbore n cazul
descris la punctul e (situaie care n general
corespunde cazului cnd funcia criteriu
returneaz valoarea zero). n acest caz, nodurile
spre care pointeaz p1 i p2 le vom considera
echivalente.
34
n cazul exemplului precedent, funcia criteriu
este:
int criteriu(NOD *p1, NOD *p2)
{
if(p2->nr < p1->nr) return(-1);
if(p2->nr > p1->nr) return(1);
return(0);
}
35
Funcia pentru tratarea echivalenei
De obicei, la ntlnirea unei perechi de noduri
echivalente, nodul din arbore (spre care pointeaz
p1) este supus unei prelucrri, iar nodul curent
(spre care pointeaz p2) este eliminat.
Pentru a realiza o astfel de prelucrare este
necesar s se apeleze o funcie care are ca
parametri pointerii p1 i p2 i care returneaz un
pointer spre tipul NOD (de obicei se returneaz
valoarea lui p1).
Vom numi aceast funcie: echivalenta. Ea este
dependent de problema concret, ca i funcia
criteriu.
36
Exemplu:
NOD *echivalenta(NOD *q, NOD *p)
{
q -> frecventa ++;
elibnod(p);
return(q);
}
Observaie:
Funcia de mai sus realizeaz urmtoarele:
- elibereaz zona de memorie ocupat de nodul spre care pointeaz p;
- incrementeaz valoarea componentei: q -> frecventa;
- returneaz valoarea lui q.
37
Alte funcii
n afar de funciile enumerate anterior, vom
folosi nite funcii specifice pentru operaii
asupra arborilor.
Exemple tipice de funcii: elibnod i incnod
Unele funcii utilizeaz o variabil global care
este un pointer spre rdcina arborelui.
38
Exemplu de funcie folosit la laborator:
void elibnod(NOD *p)
/* elibereaza zonele din memoria heap ocupate de
nodul spre care pointeaz p */
{
free(p -> cuvant);
free(p);
}
39
Intrarea n arbore
Numim prad o variabil global ctre rdcina
arborelui binar. Ea se definete astfel:
NOD *prad;
n cazul n care ntr-un program se prelucreaz
simultan mai muli arbori, se vor utiliza mai multe
variabile globale de tip prad; interfaa dintre
funcii realizndu-se cu ajutorul unui parametru
care este pointer spre tipul NOD i cruia i se
atribuie, la apel, adresa nodului rdcin al
arborelui prelucrat prin funcia apelat.
40
n continuare vom folosi funcii care
utilizeaz variabila global prad.
41
Inserarea unui nod frunz ntr-un
arbore binar
Funcia insnod insereaz un nod n
arbore, conform urmtorilor pai:
1. Se aloc zona de memorie pentru nodul care
urmeaz s se insereze n arbore. Fie p pointerul care
are ca valoare adresa de nceput a zonei respective.
2. Se apeleaz funcia incnod, cu parametrul p,
pentru a ncrca datele curente n zona spre care
pointeaz p. Dac incnod returneaz valoarea 1, se
trece la pasul 3. Altfel se revine din funcie cu valoarea
zero.
42
3. Se fac atribuirile:
p->st = p->dr = 0
deoarece nodul de inserat este nod frunz.
4. q = prad
5. Se determin poziia, n arbore, n care sa se
faca inserarea. n acest scop se caut nodul care
poate fi nod tat pentru nodul curent:
i = criteriu(q,p)
6. Dac i<0, se trece la pasul 7; altfel se trece la
pasul 8.
43
7. Se ncearc inserarea nodului spre care pointeaz p
(nodul curent) n subarborele stng al arborelui spre
care pointeaz q.
- Dac q -> st are valoarea zero, atunci nodul spre care
pointeaz q nu are subarbore stng i nodul curent
devine fiu stng al celui spre care pointeaz q (q->st =
p). Se revine din funcie returnndu-se valoarea lui p.
- Altfel se face atribuirea q = q->st (se trece la fiul stng
al nodului spre care pointeaz q) i se trece la pasul 5.
8. Dac i>0, se trece la pasul 9; altfel se trece la pasul
10.
44
9. Se ncearc inserarea nodului spre care pointeaz p
(nodul curent) n subarborele drept al arborelui spre
care pointeaz q.
- Dac q -> dr are valoarea zero, atunci nodul spre
care pointeaz q nu are subarbore drept i nodul
curent devine fiu drept al celui spre care pointeaz q
(q->dr = p). Se revine din funcie returnndu-se
valoarea lui p.
- Altfel se face atribuirea q = q->dr (se trece la fiul
drept al nodului spre care pointeaz q) i se trece la
pasul 5.
10. Nodul curent nu poate fi inserat n arbore. Se
apeleaz funcia numit echivalenta i se revine din
funcie cu valoarea returnat de funcia echivalenta.