You are on page 1of 26

Algoritmi i strukture podataka

Stabla

28.5.2007

Svojstva stabla

stablo je konaan skup vorova sa svojstvima:


z z

postoji poseban vor koji se naziva korijen (root) ostali vorovi su podijeljeni u n disjunktnih podskupova T1..Tn, od kojih je svaki stablo. T1..Tn se nazivaju i podstabla

Primjer:

a b d h i
28.5.2007

c e f j g k
2 / 26

Algoritmi i strukture podataka

Osnovni pojmovi - I

a je korijen stabla stupanj vora a je 2 (stupanj je broj podstabala nekog vora, npr. vor c
ima stupanj 3)

a b d h i e c f j g k

skup {h,i,e,f,j,k} je skup krajnjih vorova (listova) korijeni podstabala nekog vora su djeca tog vora (npr. vorovi e,f,g su djeca od c), a taj vor nazivamo roditeljem (npr. g je roditelj od j).
z

slini pojmovi se koriste i za ostale odnose (djed, braa, pretci)

Algoritmi i strukture podataka

28.5.2007

3 / 26

Osnovni pojmovi - II

a stupanj stabla je maksimalni stupanj b c od svih vorova tog stabla, u ovom primjeru 3 d e f g razina (level) nekog vora odreuje h i j k se iz definicije da je korijen razine 1, a da su razine djece nekog vora razine n jednaki n+1 dubina (depth) stabla je jednaka maksimalnoj razini nekog vora u stablu

Algoritmi i strukture podataka

28.5.2007

4 / 26

Rekurzivna stabla u prirodi

Najvee zmajevo drvo na svijetu...


Algoritmi i strukture podataka 28.5.2007 5 / 26

Binarno stablo - I

binarno stablo je stablo koje se sastoji od nijednog, jednog ili vie vorova drugog stupnja
z z

kod binarnog stabla razlikujemo lijevo i desno podstablo svakog vora nazivlje uvedeno za stabla koristi se i kod binarnih stabala

Koso stablo

a b

Potpuno stablo

a c e f g

b d h
28.5.2007

c d
Algoritmi i strukture podataka

i
6 / 26

Binarno stablo - II
Razina 1 2 3 k k+1 2k-1

1 2 4 2k-1+1 2i i 2i+1
28.5.2007

3
i/2

6 i+1
... ...

7 2k 2k-1

2k

2k+1

Algoritmi i strukture podataka

7 / 26

Binarno stablo - III

iz definicije binarnog stabla slijede zakljuci da je: z maksimalni broj vorova na k-toj razini jednak je 2k-1 z maksimalni broj vorova binarnog stabla dubine k jednak je 2k -1 za k>0 z stablo koje je visine k i ima 2k -1 elemenata naziva se puno (full) binarno
stablo
z

binarno stablo s n vorova dubine k je potpuno (complete) ako i samo ako njegovi vorovi odgovaraju vorovima punog binarnog stabla dubine k koji su numerirani od 1 do n
-

kao posljedica, razlika razina krajnjih vorova potpunog stabla najvie je jedan.

Algoritmi i strukture podataka

28.5.2007

8 / 26

Prikaz stabla statikom strukturom polje

potpuno se binarno stablo jednostavno prikazuje jednodimenzionalnim poljem, bez podataka za povezivanje i koristi se pravilima za odreivanje odnosa u stablu
z

koritenje polja poet e od lana s indeksom 1 radi jednostavnosti izraza

problem kod prikaza stabla statikom strukturom polje je i teko umetanje i brisanje vorova jer ti zahtjevi mogu traiti pomicanje puno elemenata
Koso stablo Potpuno stablo

a b

d j k

e l m n o p

a b c d e f g h i

Algoritmi i strukture podataka

28.5.2007

9 / 26

Koso i potpuno stablo

Koso stablo

a b

Potpuno stablo

a b c d e f g h i

l m n o p

Algoritmi i strukture podataka

28.5.2007

10 / 26

Pravila kod prikaza stabla poljem


1
Potpuno stablo

9 10 11 12 13 14 15 16

a b c d e f g h i

l m n o p

pravila za potpuno binarno stablo s n vorova, za i-ti vor su:


z z

roditelj(i)= i/2 za i 1; kada je i=1, vor i je korijen pa nema roditelja lijevo_dijete(i)=2*i ako je 2*i n; kad je 2*i>n vor i nema lijevog djeteta desno_dijete(i)=2*i+1 ako je 2*i+1n; kad je 2*i+1>n vor i nema desnog djeteta

ovako se mogu prikazati sva binarna stabla, ali se tada memorija ne koristi uinkovito
z

najgori sluaj su kosa (skewed) stabla koja koriste smo k lokacija od 2k -1 lokacija predvienih za to stablo
28.5.2007 11 / 26

Algoritmi i strukture podataka

Prikaz stabla dinamikom strukturom

problem se rjeava korienjem strukture s pokazivaima


z z

ovakva struktura se esto upotrebljava i zadovoljava veinu potreba ponekad se dodaje pokaziva na roditelja

struct cvor{ tip podatak; struct cvor *lijevo_dijete; struct cvor *desno_dijete; /* ako treba: */ struct cvor *roditelj; };
Algoritmi i strukture podataka 28.5.2007

12 / 26

Koso stablo glava

a b c

Algoritmi i strukture podataka

28.5.2007

13 / 26

Potpuno stablo glava

a b c e i
28.5.2007 14 / 26

d h
Algoritmi i strukture podataka

k-stabla

prirodna generalizacija binarnih stabala su k-stabla


z

k predstavlja stupanj stabla, k>2, s istim mogunostima prikazivanja

openita stabla, s raznim stupnjevima, mogu se transformirati u binarna stabla


z

to rezultira manjim i uinkovitijim algoritmima, te manjim potrebama za memorijom

Algoritmi i strukture podataka

28.5.2007

15 / 26

Stablo za traenje

moe se oblikovati stablo za traenje (sortirano, ureeno stablo) po nekom od podataka (kljuu) koji se upisuju u pojedini vor. Upis novog vora poinje pretragom od korijena stabla. Usporeuje se ve upisani podatak u vorovima s novim podatkom:
z

ako je klju novog vora manji od kljua upisanog vora usporedbe, nastavlja se usporedba u lijevom podstablu ako je klju novog vora vei ili jednak od kljua upisanog vora usporedbe, nastavlja se usporedba u desnom podstablu ako upisani vor nema podstablo u traenom smjeru, novi vor postaje dijete upisanog vora

 SortiranoStablo
Algoritmi i strukture podataka 28.5.2007 16 / 26

Dodavanje elementa u stablo

ako je stablo prazno, vrati novi vor (napisati za vjebu!)

struct node* dodaj(struct cvor* cvor, tip elem) { if (cvor == NULL) { return(NoviCvor(elem)); inae, spusti se rekurzivno niz stablo, } lijevo ili desno else { if (elem <= cvor->podatak) cvor->lijevo = dodaj(cvor->lijevo, elem); else cvor->desno = dodaj(cvor->desno, elem); return(cvor); vrati nepromijenjeni pokaziva na } }
Algoritmi i strukture podataka 28.5.2007

vor

to ako je element ve u polju?


17 / 26

Funkcija koja stvara novi vor


struct cvor* NoviCvor(int elem) { struct cvor* novi = (cvor *) malloc(sizeof(struct cvor)); cvor->podatak = elem; cvor->lijevo = NULL; cvor->desno = NULL; return(cvor); }

Algoritmi i strukture podataka

28.5.2007

18 / 26

Pretraivanje stabla

osnovni sluaj prazno stablo, traena vrijednost nije naena, vrati 0

int trazi (struct cvor* cvor, int trazeno) { if (cvor == NULL) { vrati element ako je pronaen return 0; } else { if (trazeno == cvor->podatak) return 1; else { if (trazeno < cvor->podatak) return(trazi(cvor->lijevo, trazeno)); else return(trazi(cvor->desno, trazeno)); } } inae se spusti niz odgovarajue stablo }
Algoritmi i strukture podataka 28.5.2007 19 / 26

Obilazak stabla

postoje 3 standardna naina obilaska stabla kojima se osigurava da je svaki vor bio "posjeen"
z z z

inorder: preorder: postorder:

lijevi vor korijen desni vor korijen lijevi vor desni vor lijevi vor desni vor korijen

radi se o rekurzivnim postupcima koji seu do listova stabla, a zatim povratci iz rekurzije predstavljaju kretanje prema korijenu stabla poseban sluaj inorder: ispis strukture stabla z desni vor korijen lijevi vor  SortiranoStablo dohvat podataka iz stabla s izraunavanjem  ProsjekUStablu
28.5.2007 20 / 26

Algoritmi i strukture podataka

Zadaci za vjebu

Napiite programe koji e:


a. b. c. d. e.

ispisati broj vorova u stablu ispisati dubinu stabla ispisati vrijednost najmanjeg i najveeg elementa stabla napraviti i ispisati zrcalnu kopiju zadanog stabla za dva zadana stabla, napisati jesu li identina ili ne

Algoritmi i strukture podataka

28.5.2007

21 / 26

Zadaci za vjebu

Na magnetskom disku u slijednoj formatiziranoj datoteci studenti nalaze se zapisi sljedeeg sadraja:
matini broj 8 znamenki 40+1 znakova prezime i ime 10*1 znamenka ocjene napisati program koji e formirati novu neformatiranu datoteku index u kojoj e podaci radi brzog dohvata po matinom broju biti organizirani kao ureeno binarno stablo napisati program koji za zadani matini broj, redni broj ocjene i ocjenu aurira zapise u datoteci index sve dok je matini broj vei od nule.

Algoritmi i strukture podataka

28.5.2007

22 / 26

Zadaci za vjebu

Napisati funkciju za ispis elementa memorijski rezidentnog ve oblikovanog sortiranog binarnog stabla u ije vorove su upisani
z z

cijena artikla (cijeli broj) naziv artikla (15+1 znakova)

Stablo je sortirano po cijeni artikala; lijevi jeftiniji, desni skuplji. Ulazni argument je korijen stabla. Ispis treba biti poredan po cijeni od najjeftinijeg do najskupljeg artikla.

Algoritmi i strukture podataka

28.5.2007

23 / 26

Zadaci za vjebu

U binarno stablo pohranjuje se niz podataka:

12, 15, 5, 3, 7, 2, 18, 11


a) b) c) d) e)

treba nacrtati sortirano binarno stablo (lijevi manji, desni vei) ako je stablo popunjavano redom kako su dolazili podaci poredati ulazne podatke tako da nastupi neki od najgorih sluajeva nacrtati binarno stablo koje predstavlja najbolji sluaj koliko je apriorno vrijeme izvoenja za pronalaenje pojedinog vora za b) koliko je apriorno vrijeme izvoenja za pronalaenje pojedinog vora za c)

Algoritmi i strukture podataka

28.5.2007

24 / 26

Zadaci za vjebu

U neko memorijski rezidentno binarno stablo upisane su ifre duljine 10+1 znakova. Napisati funkciju koja e provjeriti postojanje neke zadane ifre. Ulazni argumenti su korijen stabla i zadana ifra, a izlaz je 0 ako podatak ne postoji, a 1 ako postoji. U pojedinom voru stabla upisana je ifra i pokazivai na lijevi i na desni vor. U neko memorijski rezidentno sortirano binarno stablo (lijevi vor manja vrijednost, desni vor vea vrijednost) upisani su matini brojevi (cijeli broj kao klju) i teine osoba. Napisati funkciju koja e izraunati ukupnu teinu osoba iji se podaci nalaze upisani u stablu. Prototip funkcije je:
float tezina (struct cvor* korijen);

Algoritmi i strukture podataka

28.5.2007

25 / 26

Zadaci za vjebu

U neko memorijski rezidentno binarno stablo upisani su matini brojevi (cijeli broj) i teine osoba (realni broj). Napisati funkciju koja e izraunati prosjenu teinu osoba iji se podaci nalaze upisani u stablu, naenu maksimalnu teinu i broj upisanih osoba. Prototip funkcije je:
float prosjek (struct cvor *korijen, float *tezina, int *broj, float *maxtez);

U memoriji je oblikovano binarno stablo koje sadri ifru (cijeli broj) i naziv predmeta (15+1 znakova). Treba ispisati nazive predmeta tako da bude vidljiv oblik stabla. Razina vora neka odgovara broju praznina od lijevog ruba. Prototip funkcije je:
void pisi (cvor *glava, int razina);
28.5.2007 26 / 26

Algoritmi i strukture podataka

You might also like