BINÁRIS FA Definició: A fa olyanösszefüggő gráf, amelyben nincs kör Definició: Bináris fa: olyan fa, amelynek egy szögpontjából legfeljebb két él indul ki. Rekurzív típus Hierarchikus adatszerkezet
Megvalósítás: dinamikusan láncolt ábrázolásban FaT = ^CsucsT CsucsT = (ad: Tadat, bal, jobb: FaT) Használata: rendezéshez - keresőfák egyéb, pl. aritmetikai kif. Kiértékeléséhez (levél: operandus szögpont: operátor egy ág: egy zárójelezett rész) Bejárási stratégiák: BKJ, BJK, KBJ Fa felépítése a bejárási stratégiától függ
Pl. 12, 8, 10, 7, 5, 6, 16, 14, 20, 15, 23, 21 12 16 8 7 20 10 14 5 15 23 6 21
Műveletek: init beilleszt bejárás keresés törlés
Init(var p: FaT) p:= Nil Fa felépítése: Ciklusban hívjuk a fába való beillesztést. Beillesztésnél figyelembe vesszük a bejárási stratégiát - BKJ.
Beilleszt(var p: FaT, ep: Tadat) p = Nil lefoglal(p) p^.ad >=ep p^.bal: = Nil Beilleszt( p^.jobb: = Nil Beilleszt(p^.bal,ep) p^.jobb,ep) p^.ad: = ep
Bejárás(var p: FaT) P <> Nil Bejárás(p^.bal) Ki(p^.ad) Bejárás(p^.jobb) SKIP
Keres(var p: FaT, ep: Tadat, var l: L, var hely: FaT) P = Nil p^.ad=ep p^.ad>ep p^.ad<ep l:= hely:=p Keres(p^.bal, Keres(p^.jobb, l:= ep , l , hely) ep , l , hely)
Torles(var p: FaT, ep: Tadat) Törlés Ef: p = p’ & ep = ep’ uf: (ep’ p’-ben p = p’ - ep’) & (ep’ p’-ben p = p’) Torles(var p: FaT, ep: Tadat) P <> Nil p^.ad<ep p^.ad = ep p^.ad > ep Torles(p^.jobb, Gyokertorl(p) Torles(p^.bal,ep) ep) SKIP
4 eset: - törlendő elem levél - nincs jobb ág, bal részfát kapja - nincs bal ág, jobb oldali részfát kapja - mindkét részfa van, ekkor a gyökér (törlendő elem) helyére a jobboldali részfa legbaloldalibb elemét tesszük. Gyökér a törlendő elem
Gyokertorl(var p: FaT) p^.jobb = Nil s := p p^.bal = Nil p:=p^.bal s := p e:=p s := p^.jobb felszab(s) p:=p^.jobb s^.bal <> Nil felszab(s) e := s s := s^.bal ALPR
ALPR s^.bal := p^.bal e <> p e^.bal := s^.jobb SKIP s^.jobb := p^.jobb felszab(p) p := s
Bináris fa statikus v. szekvenciális megvalósítása FAT = (gyoker: N, ures: N, fa: Vektor) Vektor = vekt([1..max]: ElemT) ElemT = (bal,jobb: N, ad: Tadat)
Pl.: alma 0 0 19 körte 3 6 egres 0 0 szilva 0 0 meggy 12 0 14 15 barack 10 2 16 eper 17 1 11 málna 0 0 szamoca 7 0 9 szeder 0 0 4 20 ribizli 18 13 Gyökér 5 Üres 8
Mikor hatékony a statikus megvalósítás? Teljes a fa: levelek csak az utolsó szinten vannak Kiegyensúlyozott a fa: levélelemek között max. egy szintnyi az eltolódás Elemek tárolása vektorban szintfolytonosan: Nincs üres hely Nem kell a bal, jobb fa helyét tárolni Ha szülő indexe i, akkor a bal gyereké 2i, a jobb gyereké 2i+1
BINFAT = ( fa: VektorT, veg: N) VektorT = vekt([1..n]: Tadat) n eleme lehet maximálisan a fának. Tadat-on rendezés van értelmezve Halom vagy max. halom a kiegyensúlyozott bináris fa, ha minden csomópontjára igaz, hogy értéke nagyobb vagy egyenlő, mint a gyerekei értéke. fa(i) >= fa(2*i) fa(i) >= fa(2*i+1)
Pl.: a vektor tartalma 97,88,95,66,55,95,48,66,35,48,55,62,77,25,38,18,40,30,26,24 Feladatok: rajzoljuk föl a halmot szúrjuk be a 70-es elemet (addig visszük fölfelé az utolsó helyről, amíg a gyerekeinél nagyobb vagy egyenlő nem lesz)
Beszur(var p: BinfaT, e: Tadat) ef.: p = p’ & e = e’ uf.: p = p’ + e’ CM p.veg:=p.veg+1 ptr := p.veg szulo := [ptr/2] p.fa(ptr):= p.fa(szulo) szulo > 0 & e > p.fa(szulo) ptr := szulo szulo := [ptr/2] CM p.fa(ptr) := e
Felépit_halom(var h:BinfaT) Feladat: Építsünk föl egy halmot a következő elemekből: 44, 30, 50, 22, 60, 55, 77, 55 ef : h=h’ uf : h=halom(h’) Felépit_halom(var h:BinfaT) s:=h.veg h.veg := 0 i := 1, s Beszur(h, h.fa(i))
Célunk: Vektor rendezése A halom felépítése A halom rendezése a gyökérelemek ismételt törlésével Gyökértörlés(var h: BinfaT, var e: TAdat) ef: h = h’ & Halom(h) uf.: h = h’ - (h’ gyökere) & halom(h) & e = (h’ gyökere)
Gyökértörlés(var h: BinfaT, var e: TAdat) elem := h.fa(h.veg) e := h.fa(1) dec (h.veg) szulo := 1 bal := 2 jobb := 3 l:= jobb <= h.veg & not l elem >= h.fa(jobb) & elem >= h.fa(bal) S1 l:= S2
h.fa(jobb) <= h.fa(bal) S1 h.fa(jobb) <= h.fa(bal) h.fa(szulo):=h.fa(bal) szulo := bal h.fa(szulo):=h.fa(jobb) szulo := jobb bal := szulo*2 jobb := bal+1
l & bal = h.veg & elem < h.fa(bal) S2 l & bal = h.veg & elem < h.fa(bal) SKIP h.fa(szulo) := h.fa(bal) szulo := bal h.fa(szulo) := elem
HeapSort(var a: BinfaT) Ef.: a = a’ uf.: a.fa = rend(a.fa’) s :=a.veg Felépit_halom(a) a.veg > 1 Gyokertorles(a, a.fa(a.veg)) a.veg = s