Binární vyhledávací strom
Jan Boček – L05726
Binární vyhledávací stromy Definice: Binární vyhledávací strom (po domácku BVS) je buďto prázdná množina nebo kořen obsahující jednu hodnotu a mající dva podstromy (levý a pravý), což jsou opět BVS, ovšem takové, že všechny hodnoty uložené v levém podstromu jsou menší než hodnota v kořeni, a ta je naopak menší než všechny hodnoty uložené v pravém podstromu. Pokud x je kořen a Lx a Rx jeho levý a pravý podstrom, pak kořenům těchto podstromů (pokud nejsou prázdné) budeme říkat levý a pravý syn vrcholu x a naopak vrcholu x budeme říkat otec těchto synů. Pokud je některý z podstromů prázdný, pak vrchol x příslušného syna nemá. Vrcholu, který nemá žádné syny, budeme říkat list vyhledávacího stromu. Všimněte si, že pokud x má jen jediného syna, musíme stále rozlišovat, je-li to syn levý nebo pravý, protože potřebujeme udržet správné uspořádání hodnot. Také si všimněte, že pokud známe syny každého vrcholu, můžeme již rekonstruovat všechny podstromy.
Názorný obrázek:
Vysvětlení: ¾ ¾ ¾ ¾ ¾ ¾
Každý prvek BVS je zároveň vrcholem Vrchol „8“ je kořen stromu Vrcholy 3, 1, 6, 45, 19, 65 mají potomky Vrcholy 0, 2, 5, 7, 11, 23, 56, 100 jsou listy, nemají žádného následovníka Všechny vrcholy nalevo od kořene stromu jsou menší než je hodnota kořene Všechny vrcholy napravo od kořene stromu jsou větší než je hodnota kořene
-1-
Binární vyhledávací strom
Jan Boček – L05726
Každý BVS také můžeme popsat velmi jednoduchou strukturou v paměti: type TStrom = ^vrchol; vrchol = record levy, pravy : pvrchol; klic : integer; end;
Vysvětlení: ¾ klic = data vrcholu ¾ levy, pravy = potomci
Názorná ukázka, jakým způsobem se rozmísťují jednotlivé hodnoty v BVS Máme množinu čísel – [8, 3, 45, 1, 6, 19, 65, 0, 2, 5, 7, 11, 23, 56, 100], kde číslo 8 bude kořenem Jako druhé číslo je v seznamu číslo 3. Jelikož je číslo 3 menší než je kořen, proto se číslo 3 vykreslí vlevo od kořene. Číslo 45 je naopak větší než je kořen, proto se vykreslí napravo od kořene. Viz obrázek
Dalšími čísly v seznamu jsou čísla 1 a 6. Protože číslo 1 je menší než kořen a zároveň menší než vrchol s číslem 3, zapíše se vlevo od čísla 3. Číslo 6 je taktéž menší než je kořen, ale zároveň větší než je vrchol s číslem 3, proto se zapíše vpravo od vrcholu s číslem 3
Obdobně se to děje s ostatními čísly. Dalším číslem je 19, je větší než 8 a zároveň menší než 45, proto se vykreslí vlevo od čísla 45. A tak stejně s ostatními čísly, až dojdeme k poslednímu číslu a vznikne nám toto:
-2-
Binární vyhledávací strom
Jan Boček – L05726
Samotné vytvoření binárního vyhledávacího stromu se děje pomocí následující procedury procedure VytvorBVS(x: integer; var S: TStrom); var nvrchol: TStrom; begin if s=nil then begin new(nvrchol); nvrchol^.klic:=x; nvrchol^.pocet:=1; nvrchol^.levy:=nil; nvrchol^.pravy:=nil; s:=nvrchol; end else if x<S^.klic then VytvorBVS(x, s^.levy) else if x>S^.klic then VytvorBVS(x, s^.pravy) else s^.pocet:=s^.pocet+1; end;
Vysvětlení příkazů: ¾ var nvrchol: TStrom; vytvořím si proměnou nvrchol, která bude typu TStrom ¾ if s=nil then podmínka k zjištění, zda-li je strom prázdný nebo je odkaz na syna NILL ¾ new(nvrchol); vytvořím nový vrchol ¾ nvrchol^.klic:=x; přiřadím hodnotu novému vrcholu ¾ nvrchol^.pocet:=1; nastavíme počet na jedničku (pro zjištění, zda-li se některé číslo nevyskytuje vícekrát) ¾ nvrchol^.levy:=nil; nvrchol^.pravy:=nil; do levého i pravého koř. přiřadíme nil ¾ s:=nvrchol; nyní stromu přiřadíme nvrchol ¾ if x<S^.klic then VytvorBVS(x, s^.levy) když je vkládaný prvek(x) menší než je vrchol (klic) tak zapiš vlevo
-3-
Binární vyhledávací strom
Jan Boček – L05726
¾ if x>S^.klic then VytvorBVS(x, s^.pravy) když je vkládaný prvek(x) větší než je vrchol (klic) tak zapiš vpravo ¾ s^.pocet:=s^.pocet+1; zde zvýšíme počet o jedničku
Rušení vrcholů v binárním vyhledávacím stromu Vysvětlili jsme si, jak vytvořit BVS. Nyní si ukážeme, co se stane se stromem, když zrušíme některý z vrcholů.
Máme vytvořený strom, řekněme, že budeme chtít zrušit např. vrchol číslo 3.
Vidíme, že nám zmizel vrchol číslo 3, a že se vrchol s číslem 5 posunul na jeho místo. Stalo se to proto, že číslo 5 leží na intervalu právě mezi čísly 1 a 6 a nemá žádného následovníka (potomka). Z toho důvodu nemůže být vrchol číslo 3 nahrazen např. vrcholem s číslem 6, protože tento vrchol má potomky. Kdybychom teď smazali vrchol s číslem 5, tak se nám místo něj vypíše číslo 6. Opět z toho důvodu, že leží mezi čísly 1 a 7 a nemá žádného potomka.
-4-
Binární vyhledávací strom
Jan Boček – L05726
Nyní ještě pro zopakování si vyzkoušíme zrušit vrchol na pravé větvi. Např. vrchol s číslem 45. Už určitě víte, který vrchol jej nahradí. Máte pravdu, bude to vrchol s číslem 56.
A na závěr zrušíme kořen – tj. vrchol s číslem 8. Který vrchol se vypíše místo něj? Ano, bude to vrchol s číslem 11. Před zrušením
Po zrušení
Vrchol s číslem 11 nahradil kořen proto, že splňuje následující podmínky: 1. nemá žádného potomka 2. leží na intervalu mezi čísly 3 a 45
-5-