1 / 18

Arbori

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 .

ophira
Télécharger la présentation

Arbori

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Arbori

  2. Arbori Definiţie. Se numeşte grafG = (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.

  3. 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:

  4. Arbori - reprezentari - graf: relatia tata-fiu reprezentata ca muchie sau arc - expresie de liste de fii

  5. 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

  6. 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.)

  7. 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ă.)

  8. 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.

  9. Arbori (oarecari) - traversari Se 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.

  10. 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 endwhile endproc

  11. 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 endwhile endproc

  12. 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.

  13. Arbori binari Exemplu - reprezentari expresii aritmetice

  14. Arbori binari - traversari in adancime • î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ă)

  15. 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.left until p = nil (B) if Stack <>  then POP (Stack, p) endif endwhile endproc

  16. Arbori binari - trav. in inordine • Procedure 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} • repeat • endproc

  17. Arbori binari - trav. in postordine • procedure PostOrdine(Root) {SDR} • Stack  • p: = Root • do • (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.left • endwhile • (3) PUSH (Stack, p) • (4) p: = p.right • repeat • endproc

  18. Arbori binari însăilaţi

More Related