Úvod
Najčastejšou operáciou vykonávanou na binárnom prehľadávacom strome je vyhľadávanie kľúča uloženého v strome. Okrem operácie vyhľadávania Search podporujú binárne vyhľadávacie stromy aj operácie Minimum, Maximum, Successor a Predecessor. Tieto operácie sa všetky dajú vhodne implementovať tak, že čas ich behu je O(h), kde h je výška stromu.
^ TOPVyhľadávanie
Na vyhľadanie vrcholu s daným kľúčom sa používa procedúra Tree-Search. Ak máme kľúč k a ukazovateľ na koreň stromu,
tak procedúra vráti ukazovateľ na vrchol s kľúčom k. Ak taký vrchol neexistuje, vráti nil.
Procedúra začína hľadanie v koreni a prehľadáva strom smerom dolu. Pri každom vrchole, na ktorý narazí, porovná hodnotu v tomto vrchole s
hľadaným kľúčom k. Ak sa rovnajú, vrchol sa našiel a prehľadávanie skončí. Ak je k menšie
ako hodnota vo vrchole, vyhľadávanie pokračuje v ľavom podstrome x. Symetricky, ak je k
väčšie ako hodnota vo vrchole, pokračuje vyhľadávanie v pravom podstrome x. Uzly navštívené počas rekurzie tvoria
cestu od koreňa k hľadanému vrcholu. Ten, ak existuje je v maximálnej hĺbke h a teda čas behu Tree-Search
je O(h).
Tree-Search(x,k)
if (x = nil) or (k = key[x]) then
return x
if (k<key[x])
then return Tree-Search(left[x],k)
else return Tree-Search(right[x],k)
Náhradou rekurzie za cyklus dostávame iteratívnu verziu procedúry, ktorá je na väčšine počítačov rýchlejšia. Je označená Iterative-Tree-Search.
Iterative-Tree-Search(x,k)
while (x = nil) and (k != key[x]) do
if (k key[x])
then x:=left[x]
else x:=right[x]
return x
^ TOP
Minimum a maximum
Prvok s najmenšou hodnotou kľúča sa z definície nachádza v liste „najviac vľavo“. Teda sa dá nájsť sledovaním ukazovateľov na ľavých synov, až kým nenarazíme na nil. Vlastnosť binárnych prehľadávacích stromov priamo zaručuje korektnosť algoritmu. Ak uzol x nemá ľavý podstrom, potom minimum podstromu s koreňom x je key[x]. Ak však má podstrom, najmenší prvok je možné nájsť v podstrome s koreňom v uzle left[x]. Nájdenie maxima v strome je analogické k nájdeniu minima. Obe procedúry majú časovú zložitosť O(h), kde h je výška daného stromu.
Tree-Minimum(x)
while (left[x] != nil) do
x:=left[x]
return x
^ TOP
Nasledovník a predchodca
Niekedy je potrebné nájsť pre daný uzol binárneho prehľadávacieho stromu jeho nasledovníka alebo predchodcu. Štruktúra binárnych prehľadávacích
stromov toto umožňuje bez nutnosti porovnávať kľúče. Procedúra Tree-Successor vráti nasledovníka uzla x v strome,
ak taký neexistuje, vráti hodnotu nil.
Kód procedúry je rozdelený na dva prípady. Ak je pravý podstrom uzla x neprázdny, potom je nasledovník
uzla x vrchol s najmenšou hodnotou kľúča v tomto (pravom) podstrome. Tento zistíme použitím procedúry
Tree-Minimum(right[x]). Ak je však pravý podstrom x prázdny (a x má
nasledovníka y), potom je y najnižší predok x,
ktorého ľavý syn je tiež predok x. Zjednodušene povedané, od x ideme hore,
kým nenarazíme na vrchol, ktorý je ľavým synom svojho otca.
Na vizualizácii je zobrazený práve tento prípad.
Tree-Successor(x)
if (right[x] != nil) then
return Tree-Minimum(right[x])
y:=p[x]
while (y != nil) and (x = right[y]) do
x:=y
y:=p[y]
return y
^ TOP