arbori

18
Arbori

Upload: ophira

Post on 14-Jan-2016

33 views

Category:

Documents


1 download

DESCRIPTION

Arbori. Arbori. Definiţie. Se numeşte graf G = (X, V) o pereche formată din două mulţimi, mulţimea X a nodurilor sau vîrfurilor grafului, şi mulţimea V a muchiilor grafului, unde o muchie v  V este o pereche ordonată de noduri v=(x,y) , x,y  X . - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Arbori

Arbori

Page 2: Arbori

Arbori

Definiţie. Se numeşte graf G = (X, V) o pereche formată din două mulţimi, mulţimea X a nodurilor sau vîrfurilor grafului, şi mulţimea V a muchiilor grafului, unde o muchie v V este o pereche ordonată de noduri v=(x,y), x,y X.Un graf neorientat este un graf în care perechea (x,y) se identifică cu perechea (y,x). Un graf fără cicluri este un graf în care, pornind de la un vîrf dat nu putem ajunge din nou la el folosind muchii.

Definiţie. Se numeşte arbore un graf H = (X, V) care este neorientat, conex, fără cicluri, cu un nod precizat numit rădăcină. Pentru orice vârf x X , există un număr finit de vârfuri x1,...,xn X asociate lui x, numite descendenţi direcţi (sau fiii) lui x.

Page 3: Arbori

Arbori - def. recursiva

O structură de arbore (k-arbore), T, de un anume tip de bază este (a) fie o structură vidă (adică T = );(b) fie este nevidă, deci conţine un nod de tipul de bază, pe care-l vom numi rădăcină şi îl vom nota root(T), plus un număr finit de structuri disjuncte de arbori de acelaşi tip, T1, T2, …, Tk, numiţi subarborii lui T (sau fiii lui root(T)).

Reprezentarea ca graf a unui k-arbore:

root(T)

T1 T2 Tk

Fig.3.1.1. Un k-arbore T, cu nodul rădăcină root(T) şi fii săi, T1 , T2 ,…,Tk .

Page 4: Arbori

Arbori - reprezentari

B C D

E F G H I J

A

Fig.3.1.3. Relaţii de incluziune modelate cu 3-arbori.

- graf: relatia tata-fiu reprezentata ca muchie sau arc

- expresie de liste de fii

Page 5: Arbori

Arbori - terminologie

arborii ordonaţi, arbori în care există o relaţie de ordine între descendenţii unui nod

arborii neordonaţi, arbori în care nu există o relaţie de ordine între descendenţii unui nod

Page 6: Arbori

Arbori - terminologie

gradul arborelui = întregul k care reprezintă numărul maxim de fii ai unui nod.

Fiecărui nod al arborelui îi vom asocia un nivel în felul următor:(a)rădăcina se află la nivelul 0,(b)dacă un nod se află la nivelul i atunci fiii săi sunt la nivelul i+1.

Numim înălţime (sau adâncime) a unui arbore nivelul maxim al nodurilor sale.

Se numeşte terminal sau frunză un nod fără descendenţi.Se numeşte nod interior orice nod care nu e terminal.

Un 2-arbore ordonat se numeşte arbore binar. (fiu stâng, respectiv fiu drept.)

Page 7: Arbori

Arbori - tipuri de legaturi

Reprezentarea unui arbore cu legătură tată - fiu: din fiecare nod, avem acces la oricare dintre fii. (pentru arbori ordonaţi, pentru arbori la care accesul la noduri se face "de sus în jos”)

Cu legături de tip tată (fiecare nod "ştie" cine este tatăl său) se pot reprezenta arbori neordonaţi. (tip de legătură frecvent pentru probleme în care nodurile arborelui reprezintă elementele unei mulţimi şi suntem interesaţi să facem operaţii pe mulţimi: teste de apartenenţă şi reuniuni de mulţimi)

Un alt tip de reprezentare este cu tip de legătură fiu - frate. Aceasta înseamnă că pentru fiecare nod al arborelui avem acces la primul său fiu şi la fraţii săi. (Nodurile de pe acelaşi nivel se numesc fraţi şi îi organizăm ca listă.)

Page 8: Arbori

Fig.3.1.5. Figura (b) reprezintă arborele binar asociat canonic 3-arborelui din figura (a). S-au folosit legăturile primul fiu şi frate (reprezentate prin săgeţi punctate în figura (a)). Legătura “primul fiu” din arborele iniţial devine legătură de tip fiu stâng, iar legătura “frate” devine legătură de tip “fiu drept” în arborele binar asociat canonic.

C B

A

D

H G I F E J

(a)

Putem trece în mod canonic de la un k-arbore T (reprezentat cu legătură tată - fii) la un arbore binar care se va numi arbore binar canonic asociat lui T transformând "primul fiu" în fiu stâng şi legătura la frate în fiu drept.Prin trecerea la arborele binar canonic asociat putem transfera probleme de k-arbori la arbori binari.

Page 9: Arbori

Arbori (oarecari) - traversariSe presupune data o reprezentare in care fiecare nod are trei câmpuri: info: pentru informaţia din noduri nrfii: valoarea NF, întreagă, reprezintă numărul de fii ai nodului fii: vector de dimensiune NF, cu componente pointeri, astfel încât, fii[J] este pointer către fiul J al nodului, iar J= 1,2,…,NF.

Algoritmul de traversare este următorul:

1. Se porneşte de la rădăcină.2. La fiecare nod curent: (a) se procesează info (b) se introduc într-o structură ajutătoare fiii nodului curent în vederea procesării ulterioare.3. Se extrage din structura ajutătoare un alt nod şi se reia de la punctul 2.

Ca structură ajutătoare putem folosi una dintre structurile liniare pe care le cunoaştem, stiva sau coada.Dacă folosim o coadă obţinem traversarea în lăţime (breadth first) a arborelui.Dacă folosim o stivă obţinem traversarea în adâncime (depth first) a arborelui.

Page 10: Arbori

Arbori (oarecari) - traversare in latime

procedure TravLat(Root){traversarea în lăţime a arborelui Root, folosind o coadă Queue şi procedurile QINSERT(Queue, ) pentru inserare în coadă, respectiv, QDELETE(Queue, ) pentru ştergere din coadă} Queue {iniţializarea cozii} if Root <> nil then QINSERT (Queue, Root) endif while Queue do QDELETE (Queue, NodCrt) {procesează NodCrt. info} for K:= 1 to NodCrt .nrfii do QINSERT(Queue, NodCrt .fii[K] ) endfor endwhileendproc

Page 11: Arbori

Arbori (oarecari) - traversare in adancime

procedure TravAd(Root){traversarea în adâncime a unui arbore, Root, folosind o stivă STACK, cu procedurile PUSH (STACK, ) şi POP (STACK, ) pentru introducere, respectiv extragere din stivă} STACK {iniţializarea stivei} if Root <> nil then PUSH (STACK, Root) endif while STACK do POP (STACK, NodCrt) {procesează NodCrt . Info} for K:= NodCrt .nrfii downto 1 do PUSH (STACK, NodCrt .fii[K]) endfor endwhileendproc

Page 12: Arbori

Arbori binari

Un arbore binar (2-arbore ordonat) T este:(1) fie un arbore vid (T=).(2) fie e nevid, şi atunci conţine un nod numit rădăcină, împreună cu doi subarbori binari disjuncţi numiţi subarborele stâng, respectiv subarborele drept.

Page 13: Arbori

Arbori binari

Fig.3.2.1. Arborele binar ce reprezintă expresia aritmetică (a+(b / c))*(d-(e*f)).

*

e f

*

+ -

/ a

b

d

c

Exemplu - reprezentari expresii aritmetice

Page 14: Arbori

• în Preordine (RSD) (Rădăcină Stânga Dreapta)

• în Inordine (SRD) (Stănga Rădăcină Dreapta)

• în Postordine (SDR)(Stănga Dreapta Rădăcină)

Arbori binari - traversari in adancime

Page 15: Arbori

Arbori binari - trav. in preordine

Procedure PreOrdine(Root){RSD}Stack {iniţializarea stivei Stack cu stiva }p: = Root {iniţializare pointerului curent}

while p <> nil do (A) repeat

1) {procesează p.info}2) if p.right <> nil then

PUSH (Stack, p.right)endif

3) p: = p.leftuntil p = nil

(B) if Stack <> then POP (Stack, p)

endifendwhile

endproc

Page 16: Arbori

Arbori binari - trav. in inordineProcedure InOrdine(Root); {SRD}

Stack p: = Root

do while p <> nil do {pun câte un nod în stivă şi mă deplasez la stânga, cât pot} PUSH (Stack,p) p: = p.left

endwhile repeat

if Stack <> then{extrag câte un nod din stivă şi-l procesez}

POP(Stack, p){procesează p.info}

else return {ieşire din do..repeat}endif

until p.right <> nil {până la primul care are fiu drept} p: = p.right {mă duc un pas la dreapta şi reiau ciclul do..repeat} repeatendproc

Page 17: Arbori

Arbori binari - trav. in postordineprocedure PostOrdine(Root) {SDR}

Stack p: = Rootdo (1) while p <> nil and p.left <> nil do

PUSH (Stack, p)p: = p.left

endwhile(2) while p.right = nil do

repeat{procesează p.info}if Stack <> then

Old: = p POP (Stack, p)

else return {ieşire din do..repeat}endif

until Old = p.leftendwhile

(3) PUSH (Stack, p)(4) p: = p.right repeat

endproc

Page 18: Arbori

Arbori binari însăilaţi (a) (b)

D A H F

G B

E

C

D A H F

G B

E

C

Fig.3.2.4. Arbore binar însăilat în inordine (b): Pointerii care aveau valoarea nil în (a) au fost setaţi în felul următor: legăturile

de tip left (fiu stâng) către nodul predecesor în inordine, iar legăturile de tip right (fiu drept) către nodul succesor în inordine.