Máte-li na velikosti každého z podstromů, může to být proveditelné, aniž by bylo nutné číst data do pole (nebo jinak projíždějící strom) a počítáním. Pokud nechcete uchovávat informace o velikosti po ruce, budete potřebovat pomocnou funkci pro výpočet velikosti.
Základní myšlenka, zjistit, co je index aktuálního uzlu. Je-li menší než k, je třeba hledat levý podstrom. Pokud je větší než k, vyhledávat právo započtení uzly počítáno zleva a proudem. Všimněte si, že toto je v podstatě stejný, jako je vyhledávání pomocí pravidelného BST, s výjimkou té době hledáme indexem, ne dat. Některé pseudocode:
if size of left subtree is equal to k:
// the current node is kth
return data of current node
else if size of left subtree is greater than k:
// the kth node is on the left
repeat on the left subtree
else if size of left subtree is less than k:
// the kth node is on the right
reduce k by the size of the left subtree + 1 // need to find the (k')th node on the right subtree
repeat on the right subtree
Pro ilustraci, zvažte tento strom s vyznačenými indexy (ani starat o data, protože to není důležité při hledání):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Předpokládejme, že chceme najít 2nd (k = 2).
Od 3, velikost levého podstromu je 3.
je větší než k tak přesunout do levého podstromu.
Velikost levého podstromu je 2.
K je 2, takže je aktuální uzel musí být 2.
Předpokládejme, že chceme najít 4. (k = 4).
Od 3, velikost levého podstromu je 3.
To je méně než l, takže nastavit nový K být 0 (k‘= 4 - (3 + 1)), a přesun do pravého podstromu.
Od 6, velikost levého podstromu je 2.
Je větší, než k‘(0), takže pohyb do levého podstromu.
Velikost levého podstromu je 0.
K‘je 0, takže je aktuální uzel musí být 4..
Máte představu.