Adatszerkezetek 7a. Dr. IványiPéter 1
Fák Fákat akkor használunk, ha az adatok között valamilyen alá- és fölérendeltség van. Pl. könyvtárszerkezet gyökér () Nincsennek hurkok!!! 2
Bináris fák Azokat a fákat, amelyekben egy elemből csak két másik elembe mutat nyíl bináris fáknak nevezzük. A bináris fa Vagy üres fa Vagy egy olyan fa amelynek a bal és jobb oldali mutatója egy-egy bináris fára mutat Ez egy rekurzív definíció 3
Bináris fák Rekord { adat bal jobb } Elem 4
Bináris fák, példa alma korte szőlő barack szilva dió 5
Bináris kereső fa építése Helyezzük el az első elemet. Ha a következő elem kisebb, mint az előző akkor a gyökérelemtől balra helyezzük el, ha nagyobb akkor jobbra. A bevitt elemeket bejárva, ha a csomópontnál kisebb akkor balra menjünk, egyébként jobbra. 6
Példa Input: 5 5 7
Példa Input: 5 3 5 3 8
Példa 5 Input: 5 3 9 3 9 9
Példa 5 Input: 5 3 9 4 3 9 4 10
Példa 5 Input: 5 3 9 4 1 3 9 1 4 11
Példa 5 Input: 5 3 9 4 1 6 3 1 4 6 9 3 szint Legnagyobb elem 2 lépésben található meg Ha más sorrendben visszük be az elemeket más fát kapunk! 12
Példa 1 Input: 1 3 4 5 6 9 3 4 5 6 6szint Legnagyobb elem 6 lépésben található meg 9 13
Mélységi bejárás fákban 1. A gyökér csúcsból indulunk 2. Addig megyünk lefelé amíg lehetséges 3. Ekkor visszalépünk egyet 4. Ha most nem a gyökérben állunk akkor visszaugrunk a 2. Lépésre BACKTRACK technika (visszalépés) Másik módszer: Szélességi bejárás 14
Mélységi bejárás fákban Rekurzív függvénnyel a legszebb a megfogalmazás Függvény keres(bt) if bt == NIL return keres(bt->bal) nyomtat(adat) keres(bt->jobb) Függvény vége 15
Bejárási példa 5 3 9 1 4 6 Eredmény: 1 16
Bejárási példa 5 3 9 1 4 6 Eredmény: 1 3 17
Bejárási példa 5 3 9 1 4 6 Eredmény: 1 3 4 18
Bejárási példa 5 3 9 1 4 6 Eredmény: 1 3 4 5 19
Bejárási példa 5 3 9 1 4 6 Eredmény: 1 3 4 5 6 20
Bejárási példa 5 3 9 1 4 6 Eredmény: 1 3 4 5 6 9 (ZH kérdés) 21
Függvény 1. Függvény preorder(bt) if bt == NIL return /* csinálunk valamit */ preorder(bt->bal) preorder(bt->jobb) Függvény vége 22
Függvény 2. Függvény inorder(bt) if bt == NIL return inorder(bt->bal) /* csinálunk valamit */ inorder(bt->jobb) Függvény vége 23
Függvény 3. Függvény postorder(bt) if bt == NIL return postorder(bt->bal) postorder(bt->jobb) /* csinálunk valamit */ Függvény vége 24
Példa A B G C D E F Preorder: Inorder: Postorder: A B C D E F G C B E D F A G C E F D B G A 25
Matematikai kifejezéseknél / * G C + Postorder: C E F + * G / Preorder: / * C + E F G Inorder: ((C * (E + F)) / G) E F 26
Threaded Binary Tree A B G C D E F 27
Threaded Binary Tree Jobb mutató: a sorrendben (inorder) következő elemre mutat Bal mutató: a sorrendben (inorder) előző, felsőbb elemre mutat Gyorsabb, lineáris bejárást tesz lehetővé, nincs szükség rekurzióra Olyan esetben ha limitált a verem (stack) terület 28
Threaded Binary Tree1. A C B D G Jobb mutató: a sorrendben következő elemre mutat (inorder) E F C 29
Threaded Binary Tree2. A B G C D E F C B 30
Threaded Binary Tree3. A B G C D E F C B E 31
Threaded Binary Tree4. A B G C D E F C B E D 32
Threaded Binary Tree5. A B G C D E F C B E D F 33
Threaded Binary Tree6. A B G C D E F C B E D F A 34
Threaded Binary Tree7. A B G C D E F C B E D F A G 35
Bináris kereső fa A bináris kereső fákba gyorsan lehet adatot beilleszteni és adatot keresni Általában egy adat keresését egy N csomópontú fában log(n) idő alatt lehet végrehajtani Mivel különböző sorrendű adatok esetén különböző fát kapunk, rosszabb esetben lassabb az algoritmus (rosszul egyensúlyozott bináris fák) Egyensúlyozott fát kell létrehozni 36
Egyensúlyozás Alapművelet a forgatás balra jobbra 37
Forgatás Max szintek száma: 6 Max szintek száma: 5 (ZH kérdés) 38
Fákban vagy gráfokban Szélességi bejárás Egy tetszőleges csomópontból indulunk Minden lépésben a feldolgozandó csúcsokhoz hozzáadjuk a legutóbbi lépésben elért csúcsokat 39
Példa szélességi bejárásra 5 Lista: 5 3 9 1 4 6 Eredmény: 40
Példa szélességi bejárásra 3 5 9 Lista: 3 9 1 4 6 Eredmény: 5 41
Példa szélességi bejárásra 3 5 9 Lista: 9 1 4 1 4 6 Eredmény: 5 3 42
Példa szélességi bejárásra 3 5 9 Lista: 1 4 6 1 4 6 Eredmény: 5 3 9 43
Példa szélességi bejárásra 3 5 9 Lista: 4 6 1 4 6 Eredmény: 5 3 9 1 44
Példa szélességi bejárásra 5 Lista: 6 3 9 1 4 6 Eredmény: 5 3 9 1 4 45
Példa szélességi bejárásra 5 Lista: - 3 9 1 4 6 Eredmény: 5 3 9 1 4 6 46
Keresés, rekurzív Függvény keres(bt, k) if bt == NIL vagy bt->adat == k return bt if vége if k < bt->adat return keres(bt->bal, k) else return keres(bt->jobb, k) if vége Függvény vége O(h) : ahol h a fa magassága 47
Keresés, iteratív Függvény keres(bt, k) while bt!= NIL és k!= bt->adat if k < bt->adat bt = bt->bal else bt = bt->jobb if vége while vége Függvény vége 48
Minimum keresés Függvény min_faban(bt, k) while bt->bal!= NIL bt = bt->bal while vége return bt->adat Függvény vége O(h) : ahol h a fa magassága 49
Bináris fa Művelet Keresés Beillesztés Törlés Rendezés Átlagos eset O(log N) O(log N) O(log N) O(N) Legrosszabb eset O(N) O(N) O(N) O(N) 50
Piros-fekete fák Önegyensúlyozó bináris kereső fa Rudolf Bayer 1972-ben Hatékony, O(log N) 51