Bináris kereső fák Itterátorok
Hierarchikus Adatszerkezetek A hierarchikus adatszerkezet olyan < A, R > rendezett pár, amelynél van egy kitüntetett r ∈ A gyökérelem úgy, hogy: 1. r nem lehet végpont, azaz ∀a ∈ A esetén ¬ R(a,r) 2. ∀ a ∈ {A\{r}} elem egyszer és csak egyszer lehet végpont, azaz ∀ a ∈ {A\{r}}-hez ∃! b ≠ a, b∈A: R(b,a) 3. ∀ a ∈ {A\{r}} elem r-ből elérhető, azaz ∃a1, a2,… an ∈ A, an = a : R(r,a1), R(a1, a2) … R(an-1, an)
Bináris keresőfa Rendezési (kereső) fa Elemek értékei különböznek Elemek között rendezési reláció Minden elemére igaz: Csúcs értéke nagyobb, mint a tőle balra lévőnek Csúcs értéke kisebb, mint a tőle jobb elem értéke N csúcsú fa bejárási ideje:O(N) Elem Elem Elem Elem levél levél levél
Bináris keresőfa Műveletek: Keresés(rekurzívan) Minimum / maximum keresés Rákövetkező elem keresése Megelőző elem keresése Beszúrás Törlés Bejárások Elem Elem Elem Elem levél levél levél
Bináris keresőfába beszúr 4, 7, 9, 5, 2, 1, 3, 6 gyökér 4 2 7 1 3 5 9 6
Bináris keresőfából töröl A T bináris keresőfából a p csúcsot töröljük. Lehetőségek: p-nek még nincs gyereke: szülőjének mutatóját NIL-re állítjuk p-nek egy gyereke van: a szülője és a gyermeke között építünk ki kapcsolatot p-nek két gyereke van: átszervezzük a fát: kivágjuk azt a legközelebbi rákövetkezőjét, aminek nincs balgyereke, így I., vagy II. típusú törlés, majd ennek tartalmát beírjuk p-be.
Bináris keresőfából töröl 1, p-nek még nincs gyereke: szülőjének mutatóját NIL-re állítjuk Töröljük az 1-es értékű elemet! gyökér 4 2 7 1 3 5 9 6
Bináris keresőfából töröl 2, p-nek egy gyereke van: a szülője és a gyermeke között építünk ki kapcsolatot Törölöljük: 2-es értékű csúcsot! gyökér 4 2 7 3 5 9 6
Bináris keresőfából töröl 3, p-nek két gyereke van: átszervezzük a fát: kivágjuk azt a legközelebbi rákövetkezőjét, aminek nincs balgyereke, így I., vagy II. típusú törlés, majd ennek tartalmát beírjuk p-be. Törölöljük: 4-es értékű csúcsot! gyökér 4 7 3 5 9 6
Bináris keresőfa Műveletek: Keresés(rekurzívan) Minimum / maximum keresés Rákövetkező elem keresése Megelőző elem keresése Beszúrás Törlés Bejárások Infix /Postfix/Prefix Elem Elem Elem Elem levél levél levél
Bináris keresőfa bejárás Inorder bejárás (bal-gyökér-jobb) 1,2,3,4,5,6,7,9 gyökér 4 2 7 1 3 5 9 6
Bináris keresőfa bejárás Postorder bejárás (bal-jobb-gyökér) 1,3,2,6,5,9,7,4 gyökér 4 2 7 1 3 5 9 6
Bináris keresőfa bejárás Preorder bejárás (gyökér-bal-jobb) 4,2,1,3,7,5,6,9 gyökér 4 2 7 1 3 5 9 6
Elem osztály Fa Elem: szülő adat Jobb gyerek Bal gyerek ??? Jó ez így?? …. Egyenlőre igen, ha az elem oszt be van építve a fába, és nem örökítünk belőe..akkro lehet midnen public, de akkor is kell még bele sok további művelet A fa osztályban is nagyon fontos szerepet játszik az elem osztály: Az ábrán látható adattagokon kívül sok műveelet is a része, hogy rekurzív lehessen!
Feladat: Nyissuk meg a wikin található projektet Nézzük meg hogyan működik benne a fa Írjuk meg a törlés műveletet (el van kezdve kommentben, hogy tuti ne hagyjunk ki semmilyen lehetőséget, csak be kell helyettesíteni az előbbi diák alapján hogy mikor mit csináljon)
Iterátorok A fa szépen működik, de nem tudjuk hogy néz ki! Teljesen el van rejtve az implementáció, ami jó, mivel így nem tudunk illetéktelenül belenyúlni, de nem tudjuk tanulmányozni sem-> Szükségünk van 1 eszközre, amivel hierarchikus adatszerkezeteket tudunk bejárni! Ez az iterátor!
Iterátorok Ennek a tárgynak a keretben 2 féle iterátorral találkozunk: Beépített iterátor:pl: act a múlt órán Iterátor osztály: ez jön most… Példányosítható „kívülről” is! Szabadon tudunk vele mozogni
Feladat: A projektunk Fa osztályában tanulmányozzuk az iterátor osztály működését Írjuk meg a következő fügvényeket: (kivételkezelésesel) Void Ertek(T) – ertek betetele a mutatott elembe Mozgato muveletek szulore, es jobbbgyerekre Maximum kereses Tetszoleges elem keresese
Házi feladat Egészítsük ki a proejektet a következőképp: << operátor, ami 3 sorban kiirja a 3 bejárást Kovetkezo, es elozo műveletek az iterátoroknak, ami ha van ilyen elem akkor oda állítja őket Menü: Amivel minden művelet meghívhato ami látszik a main-ből Mindig megjeleníti az aktuális állapotot (<<) Kivétel kezelést megoldja (ha pl.: nem létező elemet törölnénk akkor azt latjuk a képernyőn, és fut tovább a program, nem szál el)