objektovo - orientované programovanie
DESCRIPTION
Objektovo - Orientované Programovanie. Binárne vyhľadávacie stromy. Reprezentácia stromov ako v halde - v jednorozmernom poli: každý prvok reprezentuje jeden vrchol stromu: prvý prvok je koreň í-ty vrchol má synov na indexoch 2*i a 2*i+1 - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/1.jpg)
Objektovo - Orientované Programovanie
Binárne vyhľadávacie stromy
![Page 2: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/2.jpg)
Reprezentácia stromov ako v halde - v jednorozmernom poli:
každý prvok reprezentuje jeden vrchol stromu:
prvý prvok je koreň
í-ty vrchol má synov na indexoch 2*i a 2*i+1
treba evidovať "diery" - miesta, ktoré nereprezentujú vrcholy
pole vrcholov, kde vrchol obsahuje info a indexy do poľa pre ľavého a pravého syna pole vrcholov - každý vrchol má spájaný zoznam synov (táto reprezentácia by sa dala použiť aj na všeobecný strom)
![Page 3: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/3.jpg)
Dynamická štruktúra pre binárny strom
type TStrom = class
info:prvok;
l,p:TStrom;
constructor Create(i:prvok; nl,np:TStrom);
function text:string; virtual;
end;
constructor TStrom.Create(i:prvok; nl, np: TStrom);
begin info:=i; l:=nl; p:=np; end;
![Page 4: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/4.jpg)
function TStrom.text:string;
begin Result:=IntToStr(info);
end;
var s:TStrom;
... s:=nil; // prázdny strom s:=TStrom.Create(1,nil,nil); s:=TStrom.Create(1,TStrom.Create(2,nil,nil),TStrom.Create(3,nil,nil));
![Page 5: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/5.jpg)
Základné algoritmy
na navštívenie postupne všetkých vrcholov (napr. výpis hodnôt)
pre N vrcholový binárny strom N! možných prechodov, len niektoré z nich sú rozumné => 3 algoritmy prechádzania vrcholmi stromov:
Preorder - najprv informáciu vo vrchole, potom v ľavom podstrome a na záver v pravom
![Page 6: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/6.jpg)
Inorder - najprv spracuje ľavý podstrom, potom info vo vrchole a na záver v pravom podstrome
Postorder - najprv spracuje ľavý, potom pravý podstrom a na záver info v samotnom vrchole
naprogramujeme metódy preorder, inorder, postorder - tieto postupne spracujú všetky vrcholy podľa špecifického poradia
![Page 7: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/7.jpg)
nasledujúce metódy vypíšu všetky vrcholy (do Memo1) v rôznych poradiach podľa príslušných algoritmov:
procedure TStrom.vypis;
// vypíše len jeden vrchol = koreňbegin Form1.Memo1.Lines.Add(text); end;
procedure TStrom.preorder;
begin
vypis; if l<>nil then l.preorder;
if p<>nil then p.preorder;
end;
![Page 8: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/8.jpg)
procedure TStrom.inorder;
begin if l<>nil then l.inorder;
vypis; if p<>nil then p.inorder;
end;
procedure TStrom.postorder;
begin if l<>nil then l.postorder;
if p<>nil then p.postorder;
vypis;
end;
![Page 9: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/9.jpg)
Ďalšie pojmy
otec = predchodca; syn = nasledovník dva stromy sú podobné, ak majú rovnakú štruktúru
(rovnaký tvar) jeden strom je kópiou druhého, ak sú podobné a
majú rovnaký obsah vrcholov úrovne: každý vrchol v strome má svoju úroveň
(level):
![Page 10: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/10.jpg)
koreň je v úrovni 0; jeho synovia sú úrovne 1 synovia vrcholu úrovne U majú úroveň U+1 v každej úrovni U je max. 2U vrcholov úplný strom úrovne U má vo všetkých úrovniach
(0 až U) maximálny počet vrcholov šírka stromu = najväčší počet vrcholov na jednej
úrovni
![Page 11: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/11.jpg)
všetky hodnoty naľavo od otca sú menšie ako otec
všetky hodnoty napravo od otca sú väčšie ako otec
všetky podstromy sú tiež BVS výpis pomocou algoritmu inorder vypíše
utriedenú postupnosť
Binárny vyhľadávací strom
![Page 12: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/12.jpg)
type prvok = integer; TVrchol = class info:prvok; l,p:TVrchol; constructor Create(i:prvok; nl,np:TVrchol); function text:string; virtual; end;
definíciu stromu rozdelíme na definíciu vrcholu stromu:
![Page 13: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/13.jpg)
constructor vrchol.Create(i:prvok; nl,np:TVrchol);begin info:=i; l:=nl; p:=np;end;
function vrchol.text:string;begin Result:=IntToStr(info);end;
![Page 14: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/14.jpg)
type TBVStrom = class private koren:TVrchol; public constructor Create; procedure vypis; function hladaj(i:prvok):TVrchol; procedure vloz(i:prvok); procedure zrus(i:prvok); end;
a trieda strom obsahuje len smerník na koreň stromu:
![Page 15: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/15.jpg)
constructor TBVStrom.Create;begin koren:=nil;end;procedure TBVStrom.vypis; procedure vypis1(s:TVrchol); begin if s=nil then exit; Form1.Memo1.Lines.Add(s.text); vypis1(s.l); vypis1(s.p); end;begin vypis1(koren); end;
![Page 16: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/16.jpg)
algoritmus sa postupne vnára do stromu, pričom na základe hodnoty vo vrchole sa rozhoduje, či pokračuje vľavo alebo vpravo
keď nenájde vrchol, vráti nil
Hľadanie v binárnom vyhľadávacom strome
![Page 17: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/17.jpg)
function TBVStrom.hladaj(i:prvok):TVrchol;begin Result:=koren; while (Result<>nil) and (Result.info<>i) do if Result.info>i then Result:=Result.l else Result:=Result.p;end;
hľadanie v BVS:
![Page 18: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/18.jpg)
najprv nájde miesto, kam by sa dal zavesiť nový vrchol (ako list), pričom sa podľa hodnoty vo vrchole rozhoduje, či pokračuje vľavo alebo vpravo
ak vrchol s danou hodnotou nájde, tak do stromu nový vrchol nevloží, ale skončí:
Vloženie nového prvku tak, aby strom ostal BVS
![Page 19: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/19.jpg)
procedure TBVStrom.vloz(i:prvok);procedure vloz1(var s:TVrchol); begin if s=nil then s:=vrchol.Create(i,nil,nil) else if s.info=i then // nič, lebo sa našiel else if s.info>i then vloz1(s.l) else vloz1(s.p) end;
begin vloz1(koren);end;
vloženie novej hodnoty do BVS:
![Page 20: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/20.jpg)
problém je iba s rušením vrcholu, ktorý má oboch synov - daný algoritmus nájde minimum v pravom podstrome vrcholu, toto minimum vyhodí a jeho hodnotu dá namiesto rušeného vrcholu:
Rušenie vrcholu tak, aby ostal strom BVS
![Page 21: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/21.jpg)
procedure TBVStrom.zrus(i:prvok);
function zrusmin(var s:TVrchol):prvok; var q:TVrchol; begin if s.l=nil then begin Result:=s.info; q:=s; s:=s.p; q.Free end else Result:=zrusmin(s.l) end;
vyhodenie vrcholu z BVS:
![Page 22: Objektovo - Orientované Programovanie](https://reader036.vdocuments.pub/reader036/viewer/2022081503/56814c1f550346895db923a5/html5/thumbnails/22.jpg)
procedure zrus1(var s:TVrchol); begin if s=nil then // nič else if s.info>i then zrus1(s.l) else if s.info<i then zrus1(s.p) else if (s.l=nil) and (s.p=nil) then begin s.Free; s:=nil end else if s.l=nil then s:=s.p else if s.p=nil then s:=s.l else s.info:=zrusmin(s.p) // z pravého podstromu minimálny prvok end;
begin zrus1(koren);end;