Literatura Dejan ivkovi, Osnove dizajna i analize algoritama, CET, Beograd, 2007 Robert Manger, Miljenko Marui, Strukture podataka i algoritmi, PMF Zagreb, skripta, 2007 ppt prezentacije D. Kalpia i kolega sa FER-a, Zagreb, 2007 Stablo Mehanizam za ureivanja odnosa izmeu podataka Za razliku od liste, koja je zasnovana na linearnom ureenju podataka, stablo se zasniva na hijerarhijskom ureenju podataka U sluaju stabla meu podacima postoji odnos podreeni-nadreeni ili roditelj dete Primeri stabla: sadraj knjige koju prouavamo, porodino stablo, razne organizacione eme, npr.vojna subordinacija, direktorijumi i datoteni sistem kod raunara, struktura programa, glavni program i potprogrami Stablo Stabla se mogu posmatrati kao specijalan sluaj grafova, odnosno slobodna stabla Mi emo se ograniiti na sluaj ureivanja podataka posredstvom korenskih stabala Ureeno stablo, T (eng. tree) je neprazni konani skup podataka istog tipa koje nazivamo vorovi stabla Ureeni par vorova naziva se grana, a skup svih grana i vorova ini stablo T Za vorove stabla vai: - postoji jedan poseban vor r, (eng. root), koji se zove koren stabla T - ostali vorovi grade konani niz (T1, T2, . . . ,Tk) od 0 ili vie disjunktnih (manjih) stabala O stablu Koren stabla se na slikama obino stavlja na vrh hijerarhijske strukture (roditelj svim drugim vorovima) Stablo je povezano ako polazei od nekog vora preko grana i vorova moemo stii do bilo kojeg vora Stablo je acikliko ako se ne moe zatvoriti putanja kroz stablo bez ponovog prolaenja kroz element putanje Ilustracija stabla T Rekurzivna definicija stabla Manja stabla T1, T2, . . .,Tk se zovu podstabla korena r Koreni r1, r2, . . ., rk od T1, T2, . . .,Tk su deca od r, a r je njihov roditelj Primetimo da koren nema roditelja, a svaki od preostalih vorova ima tano jednog roditelja Ureenost stabla se ogleda u tome to meu podstablima postoji linearno ureenje (zna se koje je prvo, koje drugo,. . .) Sadraj knjige prikazan kao stablo Primer stabla kod aritmetikih izraza Struktura aritmetikog izraza (a + b)*(a + sqrt(c)) se moe prikazati stablom vorovi bez dece predstavljaju operande, a ostali vorovi raunske operacije Ureenost stabla je vana ako su operacije nekomutativne Oznaeno stablo Stablo iz poslednjeg primera je oznaeno stablo, tj. svakom voru je pridruen dodatni podatak koji zovemo oznaka Razlikujemo ime vora od oznake vora Ime vora slui za identifikaciju (u istom stablu ne mogu postojati dva vora s istim imenom!) Oznaka vora nosi dodatnu informaciju (dva vora mogu imati istu oznaku!) Uoimo da su pojmovi: stablo, oznaka, vor (u kontekstu stabla) redom analogni pojmovima: lista, element, pozicija (u kontekstu listi) Put, predak i potomak Niz vorova i1, i2, . . . , im takvih da je ip roditelj od ip+1 (p = 1, . . . ,m 1) zove se put od i1 do im. Duina tog puta je m 1. Za svaki vor razliit od korena postoji jedinstveni put od korena stabla do tog vora Ako postoji put od vora i do vora j tada je i predak od j, a j je potomak od i Znai, koren je predak za sve ostale vorove u stablu, a oni su njegovi potomci Nivo, visina, list, unutranji vor, braa
Nivo s je skup vorova stabla sa svojstvom da
jedinstveni put od korena do tog vora ima duinu s Nivo 0 ini sam koren (po dogovoru), Nivo 1 ine deca korena, nivo 2 njihova deca, itd. Visina stabla je maksimalni neprazni nivo List je vor stabla bez dece Unutranji vor je vor koji nije list Deca istog vora zovu se braa Apstraktni tip podataka TREE Jedna od moguih definicija ATP TREE node . . . bilo koji tip (imena vorova). U skupu node uoavamo jedan poseban element LAMBDA (koji slui kao ime nepostojeeg vora), labeltype . . . bilo koji tip (oznake vorova), TREE . . . podatak tipa TREE je (ureeno) stablo iji vorovi su podaci tipa node (meusobno razliiti i razliiti od LAMBDA). Svakom voru je kao oznaka pridruen podatak tipa labeltype, MAKE ROOT(l,&T) . . . funkcija pretvara stablo T u stablo koje se sastoji samo od korena s oznakom l, (labela). Vraa vor koji slui kao koren (tj. njegovo ime). INSERT CHILD(l,i,&T) . . . funkcija u stablo T ubacuje novi vor s oznakom l, tako da on bude prvo po redu dete vora i. Funkcija vraa novi vor. Nije definisana ako i ne pripada T Dijagram za INSERT CHILD( ) Dijagram za INSERT SIBLING( ) INSERT SIBLING(l,i,&T) . . . funkcija u stablo T ubacuje novi vor s oznakom l, tako da on bude idui po redu brat vora i. Funkcija vraa novi vor. Nije definisana ako je i koren ili ako i ne pripada T. Ostale definicije ATP TREE DELETE(i,&T) . . . funkcija izbacuje list i iz stabla T. Nije definisana ako je i koren, ili ako i ne pripada T ili ako i ima dece, ROOT(T) . . . funkcija vraa koren od stabla T. FIRST CHILD(i,T) . . . funkcija vraa prvo po redu dete vora i u stablu T. Ako je i list, vraa LAMBDA. Nije definisana ako i ne pripada T. NEXT SIBLING(i,T) . .funkcija vraa idueg po redu brata vora i u stablu T. Ako je i zadnji brat, tada vraa LAMBDA. Nije definisana ako i ne pripada T. Ostale definicije ATP TREE PARENT(i,T) . . . funkcija vraa roditelja vora i u stablu T. Ako je i koren, tada vraa LAMBDA. Nije definisana ako i ne pripada T. LABEL(i,T) . . . funkcija vraa oznaku vora i u stablu T. Nije definisana ako i ne pripada T. CHANGE LABEL(l,i,&T) . . . funkcija menja oznaku vora i u stablu T, tako da ta oznaka postane l. Nije definirana ako i ne pripada T Obilazak stabla Obilazak stabla je vaan algoritam kojim poseujemo vorove stabla, tako da svaki vor posetimo tano jednom To je potrebno ako elimo obaviti neku obradu nad svim vorovima (npr. ispisati oznake) Primetimo da svaki obilazak uspostavlja jedno linearno ureenje izmeu vorova stabla Najpoznatiji naini moguih obilazaka su: PREORDER( ), INORDER( ), POSTORDER( ) Obilasci stabla Ova tri algoritma zadajemo rekurzivno: Neka je T stablo sastavljeno od korena r i podstabala T1, T2, . . . ,Tk od korena, PREORDER( ) . . . najpre poseuje r, zatim obilazi T1, zatim obilazi T2, . . ., na kraju obilazi Tk. INORDER( ) . . . najpre obilazi T1, zatim poseuje r, zatim obilazi T2, . . ., na kraju obilazi Tk. POSTORDER( ) . . . najpre obilazi T1, zatim obilazi T2, . . ., zatim obilazi Tk, na kraju poseuje r. Primeri obilazaka Primer obilazaka PREORDER( ): 0,1,2,4,7,8,5,9,3,6 INORDER( ): 1,0,7,4,8,2,9,5,6,3 POSTORDER( ): 1,7,8,4,9,5,2,6,3,0 Implementacija stabla na osnovu veze vor ->roditelj Zasniva se na tome da svakom voru eksplicitno zapiemo njegovog roditelja Mogue su razne varijante, s obzirom na razne prikaze skupa vorova Uzimamo (bez velikog gubitka optosti) da su imena vorova celi brojevi 0, 1, 2, . . ., n 1, gde je n broj vorova Stablo prikazujemo poljima i-te elije polja opisuju i-ti vor i u njima pie oznaka tog vora, odnosno kursor na roditelja Kursor root pokazuje gdje se nalazi koren stabla Implementacija stabla na osnovu veze vor -> roditelj Implementacija stabla na osnovu veze vor - > (prvo dete, idui brat) Zasniva se na tome da svakom voru eksplicitno zapiemo njegovo prvo dete, te njegovog idueg brata Veza od vora do deteta, odnosno brata, moe se realizovati pomou pointera ili pomou kursora Prikazaemo varijantu s kursorima Implementacija stabla na osnovu veze vor - > (prvo dete, idui brat)
Imena vorova su celi brojevi
Slobodnu memoriju zauzmemo globalnim poljem SPACE[] Polje predstavlja zalihu elija od kojih e se graditi stabla i-ta elija opisuje i-ti vor Stablo je prikazano kao povezana struktura elija Stablo se poistoveuje s kursorom na koren Implementacija stabla na osnovu veze vor - > (prvo dete, idui brat)
Razna stabla s kojima radimo troe elije
iz istog (jedinstvenog) polja SPACE[] Sve slobodne elije (koje ne pripadaju ni jednom stablu) povezane su u povezanu listu, iji poredak pokazuje globalni kursor avail. Slobodne elije se veu kursorima smetenim npr. u komponenti next sibling. Dijagram implementacija stabla na osnovu veze vor - > (prvo dete, idui brat) Binarno stablo Binarno stablo je jednostavnije i pravilnije struktuiran objekt od opteg stabla, pa ga je jednostavnije prikazati u raunaru Binarno stablo T je konaan skup podataka istog tipa koje zovemo vorovi Za binarno stablo T vredi: T je prazan skup (prazno stablo) , ili postoji istaknuti vor r koji se zove koren od T , a ostali vorovi grade ureeni par (TL, TR) disjunktnih (manjih) binarnih stabala. Ilustracija binarnog stabla Binarno stablo Ako T sadri koren r, tada se binarna stabla TL i TR zovu levo i desno podstablo Koren od TL (ako postoji) je levo dete od r, koren od TR (ako postoji) je desno dete od r, a r je njihov roditelj Primenjuju se isti algoritmi obilaska stabla Zapazimo da binarno stablo nije specijalni sluaj ureenog stabla. Naime: - binarno stablo moe biti prazno, - ako vor u binarnom stablu ima samo jedno dete, tada nije svejedno da li je to levo ili desno dete Sluaj dva razliita binarna stabla Primeri binarnih stabala Struktura ranije prikazanog aritmetikog izraza, sastavljenog od binarnih operacija, moe prikazati binarnim stablom Ako su znakovi kodirani nizovima bita, onda se postupak dekodiranja moe prikazati binarnim stablom: Prevoenje ureenog stabla u binarno stablo Bilo koje ureeno stablo moe se interpretirati kao binarno stablo, na osnovu veza vor -> prvo dete i vor ->idui brat Apstraktni tip podataka BTREE node . . . bilo koji tip (imena vorova) U skupu node uoavamo jedan poseban element LAMBDA (koji slui kao ime nepostojeeg vora). labeltype . . . bilo koji tip (oznake vorova). BTREE . . . podatak tipa BTREE je binarno stablo iji vorovi su podaci tipa node (meusobno razliiti i razliiti od LAMBDA) Svakom voru je kao oznaka pridruen podatak tipa labeltype. MAKE NULL(&T) . . . funkcija pretvara binarno stablo T u prazno binarno stablo.<<< EMPTY(T) . . . funkcija vraa istinu ako i samo ako je T prazno binarno stablo. Apstraktni tip podataka BTREE CREATE(l,TL,TR,&T) . . . funkcija stvara novo binarno stablo T, kojem je levo podstablo TL, a desno podstablo TR (TL i TR moraju biti disjunktni) Koren od T dobiva oznaku l. LEFT SUBTREE(T,&TL), RIGHT SUBTREE(T,&TR) . . . funkcija preko parametra TL odnosno TR vraa levo odnosno desno podstablo binarnog stabla T Nije definisana ako je T prazno. INSERT LEFT CHILD(l,i,&T), INSERT RIGHT CHILD(l,i,&T) . . . funkcija u binarno stablo T ubacuje novi vor s oznakom l, tako da on bude levo odnosno desno dete vora i. Funkcija vraa novi vor. Nije definisana ako i ne pripada T ili ako i ve ima dotino dete. DELETE(i,&T) . . . funkcija izbacuje list i iz binarnog stabla T. Nije definisana ako i ne pripada T ili ako i ima dece. Apstraktni tip podataka BTREE ROOT(T) . . . funkcija vraa koren binarnog stabla T. Ako je T prazno, vraa LAMBDA. LEFT CHILD(i,T), RIGHT CHILD(i,T) . . . funkcija vraa levo odnosno desno dete vora i u binarnom stablu T. Ako i nema dotino dete, vraa LAMBDA. Nije definisana ako i ne pripada T. PARENT(i,T) . . . funkcija vraa roditelja vora i u binarnom stablu T. Ako je i koren, tada vraa LAMBDA. Nije definisana ako i ne pripada T. LABEL(i,T) . . . funkcija vraa oznaku vora i u binarnom stablu T. Nije definisana ako i ne pripada T. CHANGE LABEL(l,i,&T) . . . funkcija menja oznaku vora i u stablu T, tako da ta oznaka postane l. Nije definirana ako i ne pripada T. Implementacija binarnog stabla pomou pointera Svakom voru eksplicitno zapiemo njegovo levo i desno dete Veza se moe zapisati pomou kursora ili pomou pointera Prikazaemo varijanta pomou pointera Implementacija binarnog stabla pomou pointera Svaki vor prikazujemo jednom elijom vor je zato jednoznano odreen pointerom na tu eliju. Binarno stablo se gradi kao struktura elija povezanih pointerima Binarno stablo poistoveujemo s pointerom na koren Prazno stablo je prikazano pointerom NULL. Ukoliko koristimo funkciju PARENT(), tada je zgodno u eliju dodati jo jedan pointer Implementacija binarnog stabla pomou pointera Implementacija potpunog binarnog stabla pomou polja Potpuno binarno stablo je graeno od n vorova, s imenima 0, 1, 2, . . ., n 1. Pritom vredi: - levo dete vora i je vor 2i + 1 (ako je 2i + 1 > n 1 tada vor i nema levo dete); - desno dete vora i je i vor 2i + 2 (ako je 2i+ 2 > n 1 tada i nema desno dete) Implementacija potpunog binarnog stabla pomou polja
potpuno binarno stablo s n = 12 vorova
Implementacija potpunog binarnog stabla pomou polja ALGORITMI I STRUKTURE PODATAKA - Stablo - Prof. Duan Starevi