Fák
Fák A fa egy olyan gráf, amelyik összefüggő és nem létezik benne kör. C D E F L K M H I J N P Q G
Fák A csúcs gyökér. F-nek A a szülője, K, L, M a gyerekei. Levelek (olyan csúcsok, melyeknek nincs gyermekük): B, C, H, I, P, Q, K, L, M, N. Testvérek (ugyanaz a szülőjük): pl. K, L, M. A fa mélysége = a gyökértől a levelekhez vezető leghosszabb út A Ebben az esetben: 3 (A, E, J, Q) B C D E F G H I J K L M N P Q
Adott a következő ősvektor: 0, 5, 8, 1, 1, 2, 3, 6 Ősvektor: Az ősvektor egy olyan tömb, mely a csomópontok ősét (apját) tárolja. A gyökér ősének megfelelő érték 0. Adott a következő ősvektor: 0, 5, 8, 1, 1, 2, 3, 6 1 4 5 2 6 8 3 7
Bináris fa Olyan fa, melyben egyetlen csúcsnak sincs kettőnél több gyereke: Példa bináris fára: részfaj gyökér részfab 1 2 3 4 5 6 7 9 8 Deklarálás Pascalban: type binfa=^adat; adat=record inf=byte; {char/string} bal, jobb:binfa; end;
A levelek kiírása 1 2 3 4 5 6 7 8 9 Procedure level(l:binfa); Begin if (l^.jobb=nil) and (l^.bal=nil) then write(l^.inf) else if l^.jobb=nil then level(l^.bal) else if l^.bal=nil then level(l^.jobb) else begin level(l^.bal); level(l^.jobb); end; End; 1 2 3 4 5 6 7 8 9
A legbaloldalibb (legjobboldalibb) csomópont meghatározása Procedure bal(l:binfa); Begin If l^.bal=nil then write(l^.inf) else bal(l^.bal); End; 1 2 3 4 5 6 Procedure jobb(l:binfa); Begin If l^.jobb=nil then write(l^.inf) else jobb(l^.jobb); End; 7 8 9
Bináris fák bejárása Azt nevezzük preorder bejárásnak amikor kiírjuk a gyökeret majd rendre bejárjuk a bal- majd a jobb részfát: 1 2 4 7 5 3 6 8 9 Azt nevezzük inorder bejárásnak amikor bejárjuk előbb a bal részfát, majd kiírjuk a gyökeret ezután bejárjuk a jobb részfát: 4 7 2 5 1 3 8 6 9 Azt nevezzük postorder bejárásnak, amikor rendre bejárjuk a bal- majd a jobb részfát és ezután kiírjuk a gyökeret: 7 4 5 2 8 9 6 3 1 1 2 3 4 5 6 7 8 9
Bináris keresőfa Bináris keresőfa: Minden X csúcsra teljesül, hogy a baloldali részfa minden csúcsában lévő információ kisebb, mint az X-ben levő, a jobboldali részfában pedig minden érték nagyobb vagy egyenlő. Szúrjunk be egy új csúcsot pl. az 5-öst Keresőfa: 6, 8, 2, 1, 4, 3, csúcsok estén 6 2 8 5 1 4 3 Példa keresőfára
Keresés Keresés (Find): a T fa azon csomópontjának értékét írja ki, amelynek információja X, vagy nil, ha nincs. Keressük meg a 2-es csúcsot. procedure Find(X: integer; T: binfa) ; Begin If T=nil then write(X,’ nem talalhato’) else If T^.inf =x then write(X,’-et megtalaltam’) else If X < T^.inf then Find(X, T^.bal) Else If X > T^.inf then Find(X, T^.jobb) End; (keressük a 2-est). 6 2 8 1 4 3 A keresőfáknál a legkisebb elem a legbaloldalibb csúcs, és a legnagyobb a legjobboldalibb csúcs értéke.
Törlés Törlés (Delete): Először megkeressük a csúcsot. Ha: a csúcs egy levél, akkor azonnal törölhető a csúcsnak egy gyereke van, akkor a szülője pointerének átírása után a csúcs törölhető a csúcsnak két gyereke van, akkor megkeressük a bal részfájában a legjobboldalibb csúcsot, ami a törlendő csúcs helyére kerül 6 8 2 4 1 3
Töröljük a 3-as csúcsot 6 2 8 1 4 3
Töröljük a 4-es csúcsot 6 2 8 1 4 3
Töröljük a 2-es csúcsot 6 2 8 1 4 3
Köszönöm a figyelmet Miklós Zoltán