You are on page 1of 17

6. STABLA Stablo u programiranju predstavlja "razgranatu" strukturu podataka u kojoj se odravaju relacije izmeu podataka.

Stablo se sastoji od jednog ili vie vorova koji zadovojavaju sledee uslove: 1. Postoji jedan vor koji predstavlja koren stabla i 2. Ostali vorovi su podeljeni u n disjunktnih skupova vorova, tako da svaki skup predstavlja stablo. Podaci su organizovani tako, da postoji jedan podatak (koren stabla) koji je u relaciji sa podacima koji su na niem nivou, a oni su u relaciji sa podacima na sledeem niem nivou. vor koji sadri vorove koji su na sledeem nivou naziva se koren, a vorovi koji ne sadre ni jednu granu, tj. nalaze se na "vrhu" stabla nazivaju se listovima. U terminologiji vor A koji sadri vor B naziva se roditelj, a vor B dete, pa je tako i nastala relacija roditelj-dete. Svaki podatak ima jednog roditelja (sem korena), i nijedno, jedno ili vie dece. Naziv stablo je nastao jer se crtanjem ovakve strukture dobija izgled naopakog stabla (slika 17).

Slika 17. Analogija strukture stabla sa drvetom Na slici 18 prikazan je primer stabla (a) i primer strukture koja ne predstavlja stablo (b). Primer (a) je stablo jer je to skup vorova sa korenim vorom (A), a ostali vorovi su podeljeni u tri disjunktna skupa {B, G, H, I}, {C, E, F} i {D}. Svaki od ova tri skupa je takoe stablo, zato to zadovoljava oba uslova napred navedena. Struktura (b) nije stablo jer je vor E podeljen i onemoguava razdvajanje vorova od B do I u disjunktne skupove.

(a) (b) Slika 18. Primer stabla (a) i primer strukture koja nije stablo (b) Stabla se u raunarstvu koriste za modeliranje podataka koji su u ovakvim odnosima. Na pr.: za efikasno raunanje aritmetikih izraza, stabla odluivanja (programiranje igara: ah, iks-oks...). Neki primeri su dati na slici 19. Stablo se najee koristiti kao glavni oblik skladita podataka,
43

zbog lakog pisanja odgovarajueg koda kroz korienje rekurzije, brzog upisivanja podataka i brzog pristupa traenim podacima. Pored ovog osnovnog tipa stable, postoji veliki broj modifikacija stabala koje slue za brzo pretraivanje po skupu podataka i najee se koriste binarna stabla. Za stablo se kae da je n - arno, odnosno reda n, ako svakom voru koji nije list odgovara maksimalno n direktno potinjenih vorova (1< n <N ). U specijalnom sluaju, kada je n = 2, re je o binarnom stablu.

Slika 19. Primeri iz ivota Stepen vora stabla je broj podstabala kojima je ovaj vor koren. Drugim reima, stepen je broj naslednika (dece) vora. Ukoliko je stepen vora nula, takav vor nazivamo list stabla. Stepen stabla se definie kao maksimum stepena svih vorova stabla. Nivo vora definiemo tako to uzmemo da je nivo korena stabla jednak 1, a zatim uveavamo ovaj broj za jedan pri svakom skoku od korena ka podstablima. Tako, nivo svih naslednika korena e biti 2, nivo njihovih naslednika 3 itd. Dubinu stabla zatim definiemo kao maksimalni nivo vora u stablu. Konstruisanje stabla Za konstruisanje stabla koriste se pokazivai da bi se usmerili ka odrovarajuim granama. Svaki vor se konstruie tako da poseduje mogunost uvanja jedne ili vie adresa drugih vorova, to omoguava "prelaenje" iz jednog u drugi vor, tj. kretanje po stablu. Stablo moe imati neogranien broj vorova, pa je zbog toga najbolje napisati funkciju koja se rekurzivno poziva, dok jedna od instanci funkcije ne primi traeni vor kao argument. Tada se izvrava odgovarajua radnja (vraanje rezultata ili stvaranje novog vora) i rekurzivni lanac se zavrava. Nedostatak rekurzije je u situacijama kada je stablo veliko, pa dolazi do pretrpavanja funkcijskog steka procesa to moe dovesti do usporavanja ili prekidanja programa. Binarno stablo (Binary Tree) Binarno stablo je struktura podataka u kojoj su povezani vorovi, tako da svaki od podataka (vorova stabla) moe imati najvie dva vora (naslednika). Elementi binarnog stabla su: Koren (root), unutranji elementi i listovi (leaf) stabla.

44

Koren (root) je vor koji se nalazi na vrhu stabla. Preostali lanovi su podeljeni u dva disjunktna skupa, tako da svaki skup predstavlja binarno stablo. Ova dva skupa se nazivaju levo i desno podstablo. Za binarno stablo vai: 1. Maksimalni broj vorova na i-tom nivou je 2i-1 2. Ako je k dubina binarnog stabla, onda je maksimalan broj vorova koje stablo moe da ima 2k-1=2k-1+2k-2+...+20 Mogu postojati i iskoena stabla (slika 20.)

Slika 20. Iskoena stabla u levo i u desno Puno binarno stablo je stablo dubine k koje sadri 2 k-1 vorova. Ukoliko je broj vorova manji od 2k-1, binarno stablo je nepotpuno. Primer potpunog binarnog stabla je prikazan na slici 21.

Slika 21. Potpuno binarno stablo Na prethodnoj slici smo vorove stabla oznaili brojevima od 1 do 7. Ukoliko je binarno stablo puno njegovi vorovi se mogu numerisati brojevima od 1 do 2 k-1, tako to bi se poelo od korena, a zatim numerisao jedan po jedan nivo sa leva na desno.

45

Predstavljanje binarnog stabla Binarno stablo moe biti predstavljno korienjem niza tako to bi vrednost u svakom voru bila pridruena elementu niza sa indeksom koji je jednak numeraciji tog vora u odgovarajuem punom binarnom stablu. Meutim, s obzirom na ozbiljne nedostatke, neemo detaljnije opisivati ovaj nain predstavljanja binarnog stabla. Umesto toga e biti prikazano predstavljanje binarnog stabla korienjem povezanih struktura. Svaki element u stablu ima pored podataka i dva pointera koji pokazuju na levo i desno podstablo (ako ih ima, ili NIL ako ih nema).

NIL

NIL

NIL

NIL

NIL

Slika 22. Implementacija binarnog stabla listom Operacije nad binarnim stablima - dodavanje novog elementa - brisanje postojeeg elementa - prolazak: preorder, inorder, postorder Dodavanje i brisanje elenata stabla vri se promenom pointera slino kao kod lista (ako su stabla implementirana pomou liste), tako da se neemo posebno baviti ovim operacijama. Malo detaljnije emo se baviti operacijama sistematskog obilaska svih elemenata stabla takozvanim algoritmima za prolazak kroz stablo. Ovo iz razloga to ovi algoritmi dobro ilustruju jedan vaan koncept u programiranju takozvanu rekurziju. Algoritmi prolaska kroz binarno stablo. Pod obilaskom binarnog stabla podrazumevamo prolazak kroz sve njegove vorove odreenim redosledom, pri emu je istovremeno mogue izvriti odreenu operaciju nad podacima koji su u njima zapisani. U zavisnosti od redosleda obrade odreenog vora i njegovog levog i desnog podstabla, obilazak stabla se moe izvriti na est naina: Skraenica Opis LPD Obilazak levog podstabla, obrada podataka, obilazak desnog podstabla LDP Obilazak levog podstabla, obilazak desnog podstabla, obrada podataka PLD Obrada podataka, obilazak levog podstabla, obilazak desnog podstabla PDL Obrada podataka, obilazak desnog podstabla, obilazak levog podstabla DLP Obilazak desnog podstabla, obilazak levog podstabla, obrada podataka DPL Obilazak desnog podstabla, obrada podataka, obilazak levog podstabla
46

pri emu: L-oznaava obilazak levog podstabla, D-oznaava obilazak desnog podstabla, P-oznaava obradu podataka u trentunom voru. Tako npr. LPD oznaava redosled u kome kreemo od korena, obilazimo levo podstablo, obraujemo podatak u korenu i na kraju obilazimo desno podstablo. S obzirom na to da su levo i desno podstablo takoe binarna stabla, potpuno ista procedura se koristi i za njihov obilazak. Redosled LPD se naziva jo i inorder, redosled LDP postorder, a redosled PLD preorder. Ostala tri redosleda se nikada ne koriste. Ukoliko prilikom obilaska stabla tampamo podatke koji se nalaze u vorovima, u zavisnosti od toga da li koristimo inorder, preorder ili postorder, dobijamo rezultate kao to je prikazano na slici 23.

Slika 23. Redosled obilaska binarnog stabla Binarno stablo za pretraivanje Binarno stablo za pretraivanje je binarno stablo koje ima sledee karakteristike: 1. vorovima binarnog stabla su pridruene vrednosti po kojima se obavlja pretraivanje. 2. Za bilo koji vor vai da vorovi u levom podstablu imaju vrednost manju od njega, a svi vorovi u desnom podstablu imaju vrednost veu od njega. I levo i desno stablo su takoe binarna stabla za pretraivanje. Primer binarnog stabla za pretraivanje je prikazan na slici 24.

Slika 24. Binarno stablo za pretraivanje


47

Binarno stablo za pretraivanje je u osnovi binarno stablo, tako da se moe obii u inorder, preorder ili postorder redosledu. Ukoliko binarno stablo za pretraivanje obiemo u inorder redosledu i pri tome odtampamo vrednosti u vorovima, dobiemo vrednosti sortirane u rastuem redosledu. Binarno stablo za pretraivanje je veoma vana struktura podataka. Ako se posmatra primer pretraivanja niza i ukoliko je niz sortiran, pretraivanje moemo znatno ubrzati korienjem binarnog pretraivanja. Meutim, ukoliko elimo da izvrimo promene u nizu kao to su dodavanje i brisanje elemenata, to e zahtevati pomeranje odreenog broja elemenata svaki put. Ovaj problem moemo reiti korienjem povezanih lista, zato to one omoguavaju dodavanje i brisanje elemenata vrlo jednostavnim premetanjem nekoliko pokazivaa. Meutim, problem sa povezanim listama je to to one ne omoguavaju direktan pristup pojedinim elementima, ve samo sekvencijalno kretanje kroz listu, element po element. Pretraivanje u binarnom stablu za pretraivanje Pretraivanje u binarnom stablu predstavlja proces u kome se trai vor u stablu, koji zadovoljava unapred definisane kriterijume. Najee je to pretraivanje u cilju nalaenja vora koji sadri odreeni podatak koji nazivamo klju. Da bismo pronali odreeni klju u datom binarnom stablu za pretraivanje, kreemo od korena stabla i uporeujemo klju sa podatkom u voru. Ukoliko su klju i podatak jednaki, funkcija vraa pokaziva na taj vor. Ako je klju manji od vrednosti u voru, isti proces ponavljamo za levo podstablo. U suprotnom, proces ponavljamo za desno podstablo. Pretraga se prekida onog trenutka kada se pronae traeni vor ili kada je podstablo koje posmatramo prazno. Ukoliko je posmatrano podstablo prazno, funkcija vraa NIL, kao znak da traeni vor nije pronaen. Zamena mesta levim i desnim podstablima Elegantan metod za zamenu mesta levim i desnim podstablima unutar binarnog stabla je korienje rekurzivnog algoritma. Funkcija zamenjuje mesta levom i desnom podstablu, a zatim na njima rekurzivno primenjuje isti postupak. Primenom ovog algoritma na binarno stablo za pretraivanje, koji bi pri inorder tampanju dalo rastui niz, dobilo bi se binarno stablo koje bi pri inorder tampanju dalo opadajui niz. Odreivanje broja vorova u binarnom stablu Broj vorova bilo kog stabla koje nije list jednak je zbiru broja vorova u njegovom levom i desnom podstablu, koji se uveava za jedan kako bi se uraunao i koren stabla. Ukoliko je stablo list (nema potomaka), onda je broj vorova u njemu jednak jedan. Ovaj opis ukazuje na potrebu rekurzivnog prolaska kroz stablo sve dok se ne doe do njegovih listova. Naredna rekurzivna funkcija vri prebrojavanje vorova u binarnom stablu. Brisanje vora iz binarnog stabla za pretraivanje Oznaimo pokaziva na vor koji elimo da obriemo sa x (skraeno: cvor x), a pokaziva na vor koji je njegov roditelj sa y. Nakon brisanja vora x, potrebno je izvriti reorganizaciju njegovih potomaka kako bi oni i dalje formirali binarno stablo za pretraivanje, a zatim
48

novoformirano podstablo povezati na odgovarajui nain sa vorom y, u zavisnosti od toga da li je vor x bio levi ili desni potomak vora y. U sluaju da je vor x bio koren stabla, onda podstablo formirano od njegovih potomaka postaje novi koren. Brisanje vora koji ima dva potomka Posmatrajmo binarno stablo prikazano na slici 25. Korienjem pomonog pokazivaa pom, prolazimo kroz levo podstablo vora x, kako bismo pronali njegov desni list, a zatim postavljamo desni pokaziva ovog lista da pokazuje na desno podstablo vora x, kao to je pokazano na slici 26. Nakon toga, pokaziva q se postavlja da pokazuje na levo podstablo vora x, a vor x se brie iz memorije. Ukoliko pokaziva y nije NIL, ostaje samo da se pokaziva postavi za odgovarajueg potomka vora y. Ako pokaziva na vor y jeste NIL (obrisan je koren).

Slika 25. Binarno stablo pre brisanje vora na koji pokazuje x Drugi nain brisanja vora je da se prolazi kroz desno podstablo vora x kako bi se ponaao njegov levi list, a zatim se levi pokaziva tog lista postavlja da pokazuje na levo podstablo vora x, kao to je prikazano na slici 27. Naravno, na kraju je potrebno obrisati vor x iz memorije. Nakon toga, pokaziva se postavlja da pokazuje na desno podstablo vora x, a vor x se brie iz memorije. Ukoliko pokaziva y nije NIL, ostaje samo da se pokaziva postavi na odgovarajueg potomka vora y.

49

Slika 26. Binarno stablo nakon brisanja vora na koji pokazuje x

Slika 27. Binarno stablo nakon brisanja vora na koji pokazuje x Brisanje vora koji ima jednog potomka Posmatrajmo binarno stablo prikazano na slici 28.
50

Slika 28. Binarno stablo pre brisanja vora na koji pokazuje x Ukoliko elimo da obriemo vor x, dovoljno je da postavimo pokaziva vora x da pokazuje na podstablo vora x koje postoji, a zatim iz memorije obriemo vor x, kao to je prikazano na slici 29. Ukoliko pokaziva y se postavlja za odgovarajueg potomka vora y.

Slika 29. Binarno stablo nakon brisanja vora na koji pokazuje x

51

Brisanje vora koji nema ni jednog potomka Posmatrajmo binarno stablo na slici 30.

Slika 30. Binarno stablo pre brisanja vora na koji pokazuje x Da bi smo obrisali vor x iz binarnog stabla, potrebno je samo da pokazivau q dodelimo NIL, a zatim, ukoliko pokaziva y nije NIL, ostaje samo da se pokaziva q postavi za odgovarajueg potomka vora y. Ako pokaziva na vor y jeste NIL (obrisan je koren), onda novi koren postaje pokaziva q (slika 31).

Slika 31. Binarno stablo nakon brisanja vora na koji pokazuje x Balanasirana stabla Pri formiranju binarnih stabala za pretraivanje najvanije je dodavanje novih elemenata. Postupak dodavanja novih elemenata mora biti izveden tako da se pri umetanju novog elementa ne narui osnovni kriterijum koje binarno stablo za pretraivanje mora da zadovolji, a to je da za svaki vor stabla mora da vai da su svi elementi manji od njega u njegovom levom podstablu, a
52

svi ostali u njegovom desnom podstablu (slika 32.). Naravno, prilikom brisanja vora iz stabla, takoe je potrebno voditi rauna o tome da se ovaj poredak ouva.

Slika 32. Binarno stablo za pretraivanje Meutim, u zavisnosti od rasporeda vorova u binarnom stablu, ovakav nain predstavljanja podataka moe biti vrlo nepovoljan. Ukoliko bi se, na primer, vorovi dodavali u stablo od najveeg ka najmanjem, dogodilo bi se da svi vorovi imaju samo levu granu, kao to je dato na slici 33. Slino bi se dogodilo i u sluaju dodavanja vorova od najmanjeg ka najveem, samo to bi u tom sluaju svi vorovi imali samo desnu granu.

Slika 33. Nepovoljni oblici binarnih stabala U ovakvim sluajevima pretraivanje stabla praktino bi se svelo na pretraivanje liste. Pored ovih ekstremnih sluajeva, slini problemi se javljaju i kod svih ostalih stabala velike dubine sa malo grananja. Iz tog razloga neophodno je stablo izbalansirati tako da levo i desno podstablo svakog vora budu priblino iste veliine. Takva struktura obezbedie maksimalan broj grananja u stablu, ime se postie minimalan broj provera prilikom pretraivanja. Stablo balansirano po dubini Stablo balansirano po dubini je binarno stablo kod koga za svaki vor vai da je apsolutna vrednost razlike dubina njegovih podstabala najvie 1. Kod ovakvih stabala dubina stabla veoma

53

sporo raste sa poveanjem broja vorova, pa je samim tim i pretraivanje bre, s obzirom da je maksimalan broj provera ogranien dubinom stabla. Ovakva stabla se nazivaju jo i AVL stabla, po njihovim pronalazaima (G. M. Adelson-Valesky i E.M. Landis). Realizacija stabla balansiranog po dubini Da bi bilo mogue efikasno realizovati koncept balansiranog stabla, neophodno je da u svakom voru postoji i informacija o razlici dubina njegovih podstabala. Da bi se u svakom trenutku ouvala izbalansiranost stabla, neophodno je napraviti funkciju za dodavanje novih vorova, koja e voditi rauna o tome da balans u svakom voru ostane u granicama -1 do 1. Meutim, prilikom dodavanja novog vora u balansirano stablo, moe se desiti da dubina jednog podstabla postane za dva vea od dubine drugog podstabla. Ti bi se dogodilo u sluaju da se vor dodaje ba u ono podstablo koje je ve imalo dubinu za jedan veu od drugog podstabla (slika 34.). U tom sluaju neophodno je izvriti odreena pregrupisavanja u stablu, kako bi se poremeeni balans vratio u granice od -1 do 1.

Slika 34. Dodavanje novog vora C remeti izbalansiranost stabla Rotacija u binarnim stablima Rotacija u binarnim stablima je operacija koja menja strukturu stabla, bez naruavanja leksikografskog poretka u njemu. Ovakve operacije mogu biti veoma korisne u odravanju stabla izbalansiranim. U zavisnosti od toga da li se poveava dubina levog ili desnog podstabla, rotacija moe biti leva rotacija i desna rotacija. Leva rotacija podrazumeva pregrupisavanje vorova tako da se poveava dubina levog podstabla, kao to je prikazano na slici 35. Suprotno, desna rotacija je pregrupisavanje vorova koje dovodi do poveanja dubine desnog podstabla

54

Slika 35. Leva i desna rotacija Dvostruke rotacije Neto sloenije transformacije jesu dvostruke rotacije, koje takoe mogu biti leva i desna. Na slici 36. je prikazana dvostruka leva rotacija.

Slika 36. Dvostruka leva rotacija Transformacija simetrina dostrukoj levoj rotaciji je dvostruka desna rotacija. Crveno-crno stablo Crveno-crno stablo je binarno stablo za pretraivanje takvo da svaki njegov vor ima pridruenu boju, koja moe biti crvena ili crna. Pored osnovnih uslova koje mora da zadovoljava svako binarno stablo, crveno-crno stablo mora da zadovolji i sledee uslove: 1. Svaki vor je crven ili crn, 2. Svi listovi su crni, 3. Oba potomka svakog crvenog vora su crna, 4. Svaka putanja od vora do njegovih listova sadri isti broj crnih vorova. Ovi uslovi obezbeuju najvaniju osobinu crveno-crnih stabala: Najdua putanja od korena do lista nije vie nego dva puta dua od najkrae putanje do listova u tom stablu. Rezultat toga je da je stablo grubo balansirano. S obzirom da operacija dodavanja, brisanja i pretraivanja u najgorem sluaju imaju vreme trajanja proporcionalno visini stabla, ovakva teorijska gornja
55

granica visine omoguava crveno-crnim stablima da budu efikasna u najgorem sluaju, za razliku od obinih binarnih stabala za pretraivanje. Da bismo razumeli zato ovi uslovi to garantuju, dovoljno je da primetimo da, zahvaljujui 3. uslovu, nijedna putanja ne moe imati dva crvena vora jedan za drugim. Najkraa mogua putanja ima sve crne vorove, a najdua mogua putanja ima i crvene i crne vorove. S obzirom da 4. uslov garantuje da sve najdue putanje imaju isti broj crnih vorova, to pokazuje da i jedna putanja ne moe biti vie nego dva puta dua od bilo koje druge putanje. U mnogim stablastim struktura je mogue da vor ima jednog ili ni jednog potomka, a da listovi sadre podatak. I crveno-crno stablo je mogue predstaviti na ovaj nain, ali se tako algoritam dodatno komplikuje. Iz tog razloga, esto se koriste nulti vorovi, (eng. null nodes), koji ne sadre nikakve podatke, ve samo slue kao indikator kraja stabla, kao to je prikazano na slici b). Ovi vorovi se najee i ne prikazuju tako da stablo prividno izgleda kao da ne zadovoljava navedene uslove, to ustvari nije tano. Posledica ovakvog predstavljanja je da svi unutranji vorovi (oni koji nisu listovi imaju dva potomka, iako jedan ili oba potomka mogu biti nulti vorovi. Kako bi se izbeglo bezpotrebno zauzimanje memorije od strane nultih vorova, moe se kreirati samo jedan pomoni vor, koji e kasnije biti korien kao nulti vor u itavom stablu.

Slika 37. Crveno-crno stablo (crveni vorovi su oznaeni belim krugovima): a) originalno; b) originalno stablo sa dodatnim malim vorovima.

56

Primeri binarnog stabla za pretraivanje u Pascalu


Deklaracija sloga za predstavljanje vora binarnog stabla u programskom jeziku Pascal bi izgledala:
type pokcvor=^cvor: cvor=record podatak: integer: levi, desni:pokcvor; end;

Primer 1. Napisati program za kreiranje binarnog stabla koristei funkciju za dodavanje elemena u stablo, a zatim vorove stabla smestiti u inorder redosled koristei funkciju i odtampati vrednosti vorova koristei proceduru za tampanje u inorder poretku.
program Stabla; uses WinCrt; type pokcvor=^cvor; cvor=record podatak: integer; levi, desni:pokcvor; end; {funkcija za dodavanje novog cvora u binarno stablo za pretrazivanje} function dodaj(p:pokcvor; vrednost:integer):pokcvor; var pom1,pom2,novi:pokcvor; begin {kreiranje novog cvora} new(novi); novi^.podatak:=vrednost; novi^.levi:=NIL; novi^.desni:=NIL; if p=NIL then p:=novi else begin {prolazak kroz stablo kako bi se pronasao cvor cije ce dete biti novi cvor} pom1:=p; while pom1<>NIL do begin pom2:=pom1; if vrednost<pom1^.podatak then pom1:=pom1^.levi else pom1:=pom1^.desni; end; if vrednost<pom2^.podatak then pom2^.levi:=novi {dodavanje novog cvora kao levog deteta} else pom2^.desni:=novi; {dodavanje novog cvora kao desnog deteta}

57

end;

end; dodaj:=p;

{funkcija za stampanje binarnog stabla u inorder redosledu} procedure stampaj_inorder(p:pokcvor); begin if p<>NIL then begin stampaj_inorder(p^.levi); write(p^.podatak, ' '); stampaj_inorder(p^.desni); end; end; var koren:pokcvor; i,n,x:integer; begin koren:=NIL; writeln('Unesite broj cvorova: '); readln(n); for i:=1 to n do begin writeln('Unesite vrednost'); readln(x); koren:=dodaj(koren, x); end; writeln; writeln('Elementi u inorder redosledu su sledeci:'); stampaj_inorder(koren); end.

Primer 2. Napisati funkciju za pretraivanje u binarnom stablu za pretraivanje.


{funkcija za pretrazivanje u binarnom stablu za pretrazivanje} function trazi(p:pokcvor; kljuc:integer):pokcvor; var pom:pokcvor; begin pom:=p; while pom<>NIL do begin if pom^.podatak=kljuc then begin trazi:=pom; exit; end else if pom^.podatak>kljuc then pom:=pom^.levi else pom:=pom^.desni;

58

end;

end; trazi:=NIL;

Odreivanje broja vorova u binarnom stablu Broj vorova bilo kog stabla koje nije list jednak je zbiru broja vorova u njegovom levom i desnom podstablu, koji se uveava za jedan kako bi se uraunao i koren stabla. Ukoliko je stablo list (nema potomaka), onda je broj avorova u njemu jednak jedan. Ovaj opis ukazuje na potrebu rekurzivnog prolaska kroz stablo sve dok se ne doe do njegovih listova. Primer 3. Napisati funkciju za odreivanje broja vorova u binarnom stablu.
{funkcija za odredjivanje broja cvorova u binarnom stablu} function broj(p:pokcvor):integer; var b:integer; begin if p=NIL then b:=0 {sluaj stabla koji nema vorova} else if (p^.levi=NIL)and (p^.desni=NIL) then b:=1 {sluaj stabla koji ima jedan vor} else b:=1 + broj(p^.levi) + broj(p^.desni); {brojanje vorova u stablu, pri emu je 1 koreni vor, a rekurzivne funkcije sekoriste za levo i desno podstablo} end;

59

You might also like