kategória | ||||||||||
|
||||||||||
|
||
Fastruktúrák. Bejárási algoritmusok. Halomrendezés. Rendezés rendezőfával.
A fa adatszerkezet
Bináris fa: minden csomópontnak 0,1 vagy 2 rákövetkezője (gyereke) lehet.
Példa A gyökér(szülő) 0. szint
Bal oldali gyerek B C Jobb oldali gyerek 1. szint
D E F G ág 2. szint
H J K levél 3. szint
Bal oldali részfa Jobb oldali részfa A fa mélysége: 4
Példa Kétoperandusos műveleteket tartalmazó algebrai kifejezés: E=(a-b)/((c*d)+e)
/
- +
a b * e
c d
Teljes bináris fa: az utolsó szintet kivéve minden szinten a csomópontok száma maximális, az utolsó szinten baloldalról helyezkednek el a csomópontok.
Példa 1
2 3
4 5 6 7
8 9 10 T10 teljes fa
Megjegyzés: K csomópont bal rákövetkezője: 2*K
K csomópont jobb rákövetkezője: 2*K+1
K csomópont szülője: K/2
Kiterjesztett bináris fa (kettes fa): minden csomópontnak 0 vagy 2 gyereke van.
2 gyerekes csomópont: belső csomópont (O)
0 gyerekes csomópont: külső csomópont (
Példa
O O
O O O O
O O O O
O O
2. példa Kétoperandusos műveletek szemléltetése:
operandus: külső csomópont
operátor: belső csomópont
Bináris fák megvalósítása
1. módszer: láncolt listákkal
gyökérmutató jobbmutató
balmutató A
B C
Æ D Æ E Æ G Æ H Æ
Æ F Æ Æ J Æ Æ K Æ
2. módszer: vektorban (szekvenciális ábrázolás)
A |
B |
C |
D |
E |
G |
H |
Æ |
Æ |
F |
Æ |
Æ |
Æ |
J |
K |
Megjegyzés: Szekvenciális ábrázolás hatékony, ha a fa teljes vagy csaknem teljes.
Bináris fák bejárása
I. Preorder bejárás (R gyökerű fáé)
1. gyökér feldolgozása
2. R bal oldali részfájának preorder bejárása
3. R jobb oldali részfájának preorder bejárása
A
B C Preorder bejárás:
D E G H ABDEFCGHJK
F J K
II. Inorder bejárás
1. R bal oldali részfájának inorder bejárása
2. R gyökér feldolgozása
3. R jobb oldali részfájának inorder bejárása
Példa A fenti ábra inorder bejárása: DBFEAGCJHK
III. Posztorder bejárás
1. R bal oldali részfájának posztorder bejárása
2. R jobb oldali részfájának posztorder bejárása
3. R gyökér feldolgozása
Példa A fenti ábra posztorder bejárása: DFEBGJKHCA
E=(a-b)/((c*d)+e
/
Preorder bejárás: - + Posztorder bejárás:
/-ab+*cde prefix jelölés a b * e ab-cd*e+/ posztfix jelölés
c d
Preorder bejárás megvalósítása verem segítségével:
MUT: a feldolgozandó csomópontra mutat
VEREM: még feldolgozandó jobb csomópontokat tárolja
A 1. 2. 3.
B C C C
D E F Æ Æ Æ
G H Mut: A Mut:B Mut: D
K
4. 5. 6. 7. 8.
H K
C C C C
Æ Æ Æ Æ Æ
Mut: G Mut: H Mut: Mut: K Mut: C
9. 10. 11.
F
Æ Æ
Mut: E Mut: F Mut: Æ eljárás vége
Halom, halomrendezés
Halom(piramis): Olyan teljes bináris fa, melynek minden csomópontjára igaz, hogy a csomópont értéke nagyobb, mint a csomópont gyermekeinek értéke.
Példa Piramis
88 95
66 55 95 48
66 35 48 55 62 77 25 38
18 40 30 28 24
Megjegyzés: Szekvenciálisan tároljuk.
Beszúrás halomba
1.lépés: Új elemet a halom végéhez csatoljuk,
hogy a teljes fa szerkezet megmaradjon
(halom nem feltétlenül).
2.lépés: Visszaállítjuk a halom szerkezetet.
Példa Az előbbi halomba beszúrjuk a 70-es elemet.
97 97 97 1. - halom végére tétel
88 88 2., 3.- beemelés a halom
55 55 70 megfelelő helyére
70 55
70 48 48
Megjegyzés: Sorozatból halmot építeni beszúrások sorozatával.
Példa 44,30,50,22,60
1. 2. 3. 4. 5. 6. 7. 8.
44 44 44 50 50 50 50 60
30 30 50 30 44 30 44 30 44 60 44 50 44
22 22 60 22 30 22 30
Halom gyökerének törlése
1. lépés: R gyökeret töröljük (értékül adjuk egy változónak)
2. lépés: gyökér helyére tesszük
az utolsó elemet
(megmarad a teljes fa
szerkezet, halom nem feltétlenül)
3. lépés: az új gyökeret a megfelelő helyre illesztjük a fában
Példa 95 15
85 70 85 70
55 33 30 65 55 33 30 65
15
1., 2.
85 85
15 70 55 70
55 33 30 65 15 33 30 65
3., 4.,
Halomrendezés
Rendezzük A tömb elemeit!
1. lépés: H halom felépítése A elemeiből.
2. lépés: H gyökerének ismételt törlése. (Más vektorba, vagy A vektor végére)
Műveleti igény: O(n log2n) (n=104 13,29
Megjegyzés: Buborék rendezés: O(n2) (n=104 108)
:
1776