stablo - ipaq petaipaq.petagimnazija.hr/wp-content/uploads/2014/12/stablo.pdf · stablo (tree)...
TRANSCRIPT
Stablo
Uvod
Za razliku od stoga i reda koji su linearne
strukture, stablo je hijerarhijska struktura
podataka
U takvoj strukturi jedan element ima više
elemenata koji iz njega slijede
Elemente stabla nazivamo čvorovima
Među čvorovima postoje određene
veze
Stablo (Tree)
korijen – prvi čvor u stablu
korijen je poveznicama spojen s jednim ili više djece
susjedi – djeca istog čvora
list – čvor koji nema djece
unutarnji čvor – čvor koji ima najmanje jedno dijete
dubina stabla – udaljenost korijena do najudaljenijeg lista
binarno stablo – svaki čvor ima najviše dvoje djece
potpuno binarno stablo – stablo kod kojeg svi čvorovi osim listova imaju dvoje djece
Binarno stablo (Binary Tree)
razina 0
razina 1
razina 2
razina 3
A
B C
D E
F
Stablo (Tree)
Obilasci stabla
postupak obilaženja svih čvorova stabla
preorder : korijen – lijevo – desno
inorder : lijevo – korijen – desno
postorder : lijevo – desno - korijen
Obilasci stabla – primjer 4
Sljedeće binarno stablo obiđimo
preorder, inorder te postorder metodom
razina 0
razina 1
razina 2
razina 3
A
B C
D E
F
Preorder: ABCDEF
Inorder: BADCFE
Postorder: BDFECA
Binarno stablo (Binary Tree) - Implementacija
class BTree:
def __init__(self, k, l = None, d = None):
self.Korijen = k
self.Lijevo = l
self.Desno = d
return
def preorder(self):
s = self.Krijen
if self.Lijevo != None:
s += self.Lijevo.preorder()
if self.Desno != None:
s += self.Desno.p
return s
Binarno stablo – primjer 5
Koristeći kreiranu klasu kreirajmo binarno stablo kao na slici a potom ispišimo vrhove onim redoslijedom kako bismo ih obišli metodom preorder
A
B C
D E
F
>>> f = BTree('F')
>>> e = BTree('E', l = f)
>>> d = BTree('D')
>>> e = BTree('C', l = d, d = e)
>>> d = BTree('B')
>>> s = BTree('A', l = d, d = e)
>>> s.preorder()
'ABCDEF'
Rekonstrukcija binarnog stabla iz obilazaka
inorder + još jedan obilazak (preorder ili
postorder)
prvi znak iz preorder obilaska (posljednji
iz postorder) – korijen stabla
Sljedeći znak – lijevo ili desno dijete
(ovisi o poziciji u inorder obilasku)
Rekonstrukcija stabla – primjer 6
Rekonstruirajmo binarno stablo ako su dani njegovi sljedeći obilasci:
Preorder: ABCDEF
Inorder: BADCFE
A
B C
D E
F
Rekonstrukcija binarnog stabla -
Implementacija
def rekonstrukcija(preorder, inorder):
t = BTree(preorder[0])
for c in preorder[1:]:
r = t; tmp = BTree(c); dodan = False
while not dodan:
if inorder.index(tmp.K) < inorder.index(r.K):
if r.Lijevo != None:
r = r.Lijevo
else:
r.Lijevo = tmp; dodan = True
else:
if r.Desno != None:
r = r.Desno
else:
r.Desno = tmp; dodan = True
return t
Binarno stablo traženja
Svi čvorovi lijevo od nekog čvora imaju
vrijednost koja je manja ili jednaki od
vrijednosti čvora
Svi čvorovi desno od nekog čvora imaju
vrijednost veću ili jednaku od vrijednosti
čvora 3
1 5
2 4 6
Binarno stablo traženja - kreiranje
r – niz znakova
prvi znak = korijen
uzimamo redom jedan po jedan znak
te ga postavljamo u stablo tako da
stablo zadrži svojstvo binarnog stabla
traženja
Binarno stablo traženja – primjer 7
Kreirajmo binarno stablo traženja za riječ STABLO
S
A T
B
L
O