Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

1 STROMY Datová struktura sestávající z uzlů Uzel – má jednoho předchůdce a N následníků Kořen – uzel, který nemá předchůdce List – uzel, který nemá následníky.

Podobné prezentace


Prezentace na téma: "1 STROMY Datová struktura sestávající z uzlů Uzel – má jednoho předchůdce a N následníků Kořen – uzel, který nemá předchůdce List – uzel, který nemá následníky."— Transkript prezentace:

1 1 STROMY Datová struktura sestávající z uzlů Uzel – má jednoho předchůdce a N následníků Kořen – uzel, který nemá předchůdce List – uzel, který nemá následníky Pro N=2 hovoříme o binárních stromech

2 2 BINÁRNÍ STROMY Každý uzel má nejvýše dva potomky Jednoduchý, acyklický souvislý graf Hierarchická nelineární struktura Úplný BS – každý uzel má právě dva potomky, nebo je listem Úroveň k BS; každá úroveň má až 2 k uzlů Vyvážený BS Binární vyhledávací strom

3 3 BINÁRNÍ STROM KOREN nil 0. úroveň 1. úroveň 2. úroveň 3. úroveň 4. úroveň

4 4 USPOŘÁDANÝ STROM Často jsou stromy aplikovány v řadicích a vyhledávacích algoritmech Uspořádání uzlů je podle datových položek – klíče Uspořádání: Klíč (hodnota) každého uzlu je větší než hodnoty (klíče) všech uzlů jeho levého podstromu a menší než klíče všech uzlů jeho pravého podstromu – binární vyhledávací strom (BVS)

5 5 10 BINÁRNÍ STROM (s hodnotami) 19 KOREN 20 nil 25 nil 23 nil nil 13 nil 12 nil úroveň 1. úroveň 2. úroveň 3. úroveň 4. úroveň

6 6 POUŽITÍ STROMŮ Hledání duplicitních výskytů Řazení pomocí binárního stromu Prohlížení stromu a tisk hodnot (klíčů) type SPOJ = ^UZEL UZEL = record HODN: byte {string[14],...} LU, PU: SPOJ end; var KOREN: SPOJ;

7 7 TVORBA BINÁRNÍHO STROMU procedure VLOZ(var KAM: SPOJ; CO: byte); begin if KAM = nil then begin new (KAM); KAM^.HODN := CO; KAM^.LU := nil; KAM^.PU := nil; end else if CO < KAM^.HODN then VLOZ(KAM^.LU, CO) {vlevo} else VLOZ(KAM^.PU, CO) {vpravo} end

8 8 Vlastní strom vytvoříme např. algoritmem Procedure VYTVOR(var BS:SPOJ); var KAM:SPOJ; CO:byte; {nebo integer, string apod.} begin BS:=nil; Write(‘Napis koren: ’); Readln(CO); if CO<>0 then VLOZ(BS,CO); {konec pri CO=0} while CO<>0 do begin Write(‘Dalsi uzel: ‘); Readln(CO); if CO<>0 then begin KAM:=BS; VLOZ(KAM,CO) end

9 9 PRŮCHOD STROMEM V podstatě existují tři možnosti průchodů stromem: a)PREORDER 1.navštiv kořen 2.projdi levý podstrom PREORDER 3.projdi pravý podstrom PREORDER

10 10 procedure PREORDER(H: SPOJ); begin if H <> nil then begin writeln(H^.HODN); PREORDER(H^.LU); PREORDER(H^.PU) end Uskuteční se postupně tisk uzlů:

11 11 b)INORDER 1.projdi levý podstrom INORDER 2.navštiv kořen 3.projdi pravý podstrom INORDER

12 12 procedure INORDER(H: SPOJ); begin if H <> nil then begin INORDER(H^.LU); writeln(H^.HODN); INORDER(H^.PU) end Uskuteční se postupně tisk uzlů: Tímto způsobem dostáváme vzestupně seřazené hodnoty. Vzájemnou výměnou obou příkazů procedury INORDER bychom tiskli hodnoty seřazené sestupně.

13 13 c)POSTORDER 1.projdi levý podstrom POSTORDER 2.projdi pravý podstrom POSTORDER 3.navštiv kořen

14 14 procedure POSTORDER(H: SPOJ); begin if H <> nil then begin POSTORDER(H^.LU); POSTORDER(H^.PU); writeln(H^.HODN) end Uskuteční se postupně tisk uzlů: Tento přístup využijeme při rušení stromů, postupně uvolňujeme (dispose) listy počínaje vždy nejlevějším listem.

15 15 Vypíšeme-li hodnoty z binárního stromu metodou (procedura) INORDER, získáme neklesající posloupnost hodnot: procedure TISK(PS: SPOJ); begin if PS <> nil then begin TISK(PS^.LU); writeln(PS^.HODN); TISK(PS^.PU) end

16 16 Procedura TISK je totožná s procedurou INORDER; spojíme-li však tisk hodnot s uvolněním příslušných uzlů, je pak zřejmé, že uvolňování uzlů provedeme metodou (procedurou) POSTORDER: procedure TISK(PS: SPOJ); begin if PS <> nil then begin TISK(PS^.LU); writeln(PS^.HODN); TISK(PS^.PU); dispose(PS) end

17 17 Reprezentace aritmetického výrazu binárním stromem Aritmetický výraz tvořený operandy a binárními operátory Kořen stromu obsahuje operátor, jeho levý či pravý podstrom tvoří buď –výraz, který má opět levý a pravý podstrom –operandy; operand je listem (nemá podstromy)

18 18 + KOREN C nil B A KOREN C nil + B A I.Reprezentace výrazu A+B*C II.Reprezentace výrazu (A+B)*C * *

19 19 + C nil B A C + B A * * / KOREN III.Reprezentace výrazu (A+B*C)/((A+B)*C)

20 20 Při průchodu jednotlivých stromů I)-III) metodou PREORDER navštěvujeme uzly v pořadí ad I) +A*BC ad II) *+ABC ad III) /+A*BC*+ABC Dostáváme tzv. prefixovou formu zápisu výrazu.

21 21 Při průchodu jednotlivých stromů I)-III) metodou POSTORDER navštěvujeme uzly v pořadí ad I) ABC*+ ad II) AB+C* ad III) ABC*+AB+C*/ Dostáváme tzv. postfixovou formu zápisu výrazu. Obě uvedené formy, zejména pak tato postfixová, (na rozdíl od infixové formy) se uplatňují např. při tvorbě analyzátorů jako součásti překladačů.

22 22 Při průchodu jednotlivých stromů I)-III) metodou INORDER navštěvujeme uzly v pořadí ad I) A+B*C ad II) A+B*C ad III) A+B*C/A+B*C Dostáváme vcelku nepoužitelnou (nejedno- značnou) infixovou formu zápisu výrazu. Infixová forma zápisu výrazu vyžaduje použití závorek k vyznačení priority prováděných operací


Stáhnout ppt "1 STROMY Datová struktura sestávající z uzlů Uzel – má jednoho předchůdce a N následníků Kořen – uzel, který nemá předchůdce List – uzel, který nemá následníky."

Podobné prezentace


Reklamy Google