Download as pdf or txt
Download as pdf or txt
You are on page 1of 19

5.

Nelinearne strukture

5. Stabla
5.a) opća stabla
5.b) binarna stabla
- poredana binarna stabla
- proširena binarna stabla
- Huffmanova stabla
- potpuna binarna stabla
- hrpe
5.a) Opće stablo
Stablo je hijerarhijska struktura koja se sastoji od
čvorova i grana. Čvorovi su “točke” (ili kružići u
grafičkom prikazu), koji su spojeni dužinama koje se
nazivaju granama.

Hijerarhijska struktura stabla uočava se iz činjenice, da


čvorovi mogu imati podređene čvorove (povezane
granama “prema dolje”) i najviše jedan nadređeni čvor
(povezan granom “prema gore”). Svi čvorovi osim
jednog, koji se zove korjen imaju jedan nadređeni čvor.
Korjen nema nadređeni čvor.
Primjer općeg stabla
Stablo na slici naziva se općim stablom jer broj
podređenih čvorova može biti proizvoljan.

a b c
d

e j k
f g h i

l m n o
Vrste općih stabala
Stabla mogu biti uređena i neuređena.
Kod uređenih stabala redoslijed podređenih čvorova je
bitan, a kod neuređenih taj redoslijed nije bitan.
Poseban slučaj uređenog općeg stabla je okta-stablo.
Koristi se u 3D računalnoj grafici.
Prikaz u računalu

Efikasan način prikaza općeg stabla u računalu nije


jednostavan. Uključuje kombinaciju jednostavnijih
struktura koje koriste dinamički rad s memorijom.
Zbog toga nećemo raditi nikakve algoritme s ovom
strukturom podataka. Primjer u C-u:
struct cvor {
int x;
struct cvor *firstchild;
struct cvor *nextsibling;
};
struct cvor *korijen = NULL;
5.b) Binarna stabla
Binarno stablo je stablo kod kojeg svaki čvor može imati
najviše dva nasljednika.

Njih dva zovemo lijevi i desni nasljednik.

Svaka razina binarnog stabla ima zato ograničen


maksimalni broj čvorova:
i-ta razina može imati najviše 2i čvorova
Primjer binarnog stabla
R
a
e b
l f g c
m h d
i j
n k
o
Prikaz binarnog stabla u računalu
Postoje dva osnovna načina prikaza binarnog stabla u
računalu:
- statički način pomoću ‘matrice s 3 stupca’
- dinamički način

Oba ova načina pružaju efikasan način iskorištenja


memorije.
Međutim, ni jedan način ne nudi direktan pristup svakom
elementu (čvoru), a to je tipično za nelinearne strukture
podataka.
Prikaz binarnog stabla pomoću matrice
U prvi stupac stavlja se vrijednost elementa (čvora).
U drugi stupac stavlja se broj retka gdje je lijevi nasljednik.
U treći stupac stavlja se broj retka gdje je desni nasljednik.
Matrica ima onoliko redaka koliko ima čvorova.
U prvi redak obavezno se stavlja korijenski čvor.
Redoslijed ostalih čvorova nije bitan.
1 2 3
1 R 3 0
R
2
a
3 a 8 2
e

...
b
N
...

...
...
Binarno stablo pomoću dinamičke
strukture (1/2)
Osnovni element dinamčke strukture za prikaz binarnog
stabla sastojao bi se od tri podelementa:
x - vrijednost čvora (bilo koji tip podataka)
lijevi - memorijska adresa gdje je lijevi nasljednik
desni - memorijska adresa gdje je desni nasljednik

Slično kao kod povezanog popisa, kod stabla svim


čvorovima pristupamo krenuvši od posebne memorijske
adrese koja je jedina poznata i nazvat ćemo ju
korijen
Binarno stablo pomoću dinamičke
strukture (2/2)
korijen

x - dio s podacima
lijevi
desni

NULL - ako nema


nasljednika
Problem obilaska stabla (1/2)
ZADANO: Binarno stablo B, B stablo sadrži N čvorova
TRAŽI SE: Ispisati sve elemente (čvorove) stabla B po
određenom pravilu
Stablo je nelinearna struktura i kod obilaska čvorova treba uvesti
neko pravilo po kojem ćemo pristupati čvorovima.

Kod binarnog stabla uobičajeni su obilasci po dubini. Takav


obilazak prati put od korjena (vrha) stabla “u dubinu” do najnižeg
nivoa odakle “počinje” obilazak.

Uobičajeno je da da se takvi obilasci definiraju tako, da se


“spuštanje” do najnižeg nivoa obavlja “po lijevoj strani” tj. da se
od nadređenog čvora “krene” prema lijevom nasljedniku.
Problem obilaska stabla (2/2)
U tom slučaju će se lijevi nasljednik L uvijek naći na popisu prije
desnog nasljednika D. Nadređeni čvor N će se ovisno o
definiranom načinu obilaska naći ispred, između ili iza podređenih
čvorova L i D. Zato razlikujemo:
NLD obilazak (eng. preorder),
LND obilazak (eng. inorder) i
LDN obilazak (eng. postorder).
Za realizaciju ovih obilazaka obično se koristi stog ili rekurzivna
funkcija.

Drugi uobičajeni način jeste obilazak čvorova po razinama, mogli


bi takav način obilaska nazvati obilazak ‘po širini’ stabla.
U ovom slučaju trebalo bi koristiti strukturu red.
Obilazak NLD - preorder (1/3)
Kako se binarno stablo može prikazati na dva načina u računalu,
u sljedećem rješenju ćemo uzeti u obzir prikaz stabla pomoću
‘matrice s 3 stupca’. Označimo tu matricu s B.
Isto tako koristit ćemo stog.

Algoritam NLD OBILAZAK

NLD(1) /* ukoliko bi koristili prikaz pomoću


dinamičke strukture onda bi umjesto
1 stavili korijen */
Obilazak NLD - preorder (2/3)
Algoritam procedure NLD( cvor )
Clear( )
Push( cvor )
Sve dok nije Is_empty( ) činiti
cvor = Pop( )
Ispisati Bcvor,1
Ako je Bcvor,3  0 onda Push( Bcvor,3 )
Ako je Bcvor,2  0 onda Push( Bcvor,2 )
Obilazak NLD - preorder (3/3)
R
Za primjer stabla na slici, NLD
obilazak bi ispisao sljedeći a b
redoslijed čvorova: c e
f d
R, a, c, f, d, b, e, g, h g h

Složenost NLD, a tako i složenost svakog obilaska je linearna, tj.


vrijeme izvođenja linearno ovisi o broju čvorova N
O(N)
Obilazak NLD rekurzijom
Već smo rekli da se svaki algoritam koji koristi stog može napisati
i kao rekurzivna funkcija. To je slučaj i s procedurom NLD:

Algoritam procedure NLD( cvor )


Ispisati Bcvor,1
Ako je Bcvor,2  0 onda pozovi NLD( Bcvor,2 )
Ako je Bcvor,3  0 onda pozovi NLD( Bcvor,3 )
Obilazak LND rekurzijom
Dat ćemo rekurzivnu funkciju, osim toga uzet ćemo da se binarno
stablo prikazuje dinamičkom strukturom.
Algoritam procedure LND( cvor )
Ako je cvor.lijevi  NULL onda pozovi LND( cvor.lijevi )
Ispisati cvor.x
Ako je cvor.desni  NULL onda pozovi LND( cvor.desni )

R
LND (inorder) obilazak za
a b
stablo na slici glasi:
c e
f d f, c, a, d, R, b, g, e, h
g h
Obilazak LDN rekurzijom
Ovaj put ćemo opet upotrijebiti dinamički prikaz stabla u memoriji.
Postorder obilazak ima naredbu za ispis u trećoj liniji funkcije.
Algoritam procedure LDN( cvor )
Ako je cvor.lijevi  NULL onda pozovi LDN( cvor.lijevi )
Ako je cvor.desni  NULL onda pozovi LDN( cvor.desni )
Ispisati cvor.x

R
LDN (postorder) obilazak
a b
za stablo na slici glasi:
c e
f d f, c, d, a, g, h, e, b, R
g h

You might also like