Ha megvan a mérete az egyes részfák, ez lehet megvalósítható anélkül, hogy olvasni az adatokat egy tömbbe (vagy más áthaladó fa) és számolás fel. Ha nem tartja a méret információ kéznél, akkor szüksége lesz egy segítő funkciót méretének kiszámítására.
Az alapötlet, kitalálni, hogy mi van az index a jelenlegi csomópont. Ha ez kevesebb, mint k, meg kell keresni a bal részfa. Ha ez nagyobb, mint k, keresés a jobb ellensúlyozó csomópontok balról számítva és aktuális. Megjegyzendő, hogy ez lényegében ugyanaz, mint a kereső segítségével rendszeresen BST, kivéve, ezúttal keresünk az index, nem az adatok. Néhány pszeudokódját:
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
Annak illusztrálására, hogy ezt a fát a jelölt indexek (ne aggódj az adatok nem fontos a keresés):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Tegyük fel, hogy szeretné megtalálni a 2. (k = 2).
-tól 3, a méret a bal oldali részfa 3.
Ez nagyobb, mint k, így mozgatni a bal részfa.
A méret a bal részfa 2.
k is 2 így a jelenlegi csomópontot kell a 2..
Tegyük fel, hogy szeretné megtalálni a 4. (k = 4).
-tól 3, a méret a bal oldali részfa 3.
Ez kevesebb, mint l úgy állítsa be az új k értéke 0 (k”= 4 - (3 + 1)), és mozgassa a jobb részfa.
-tól 6, a méret a bal oldali részfa 2.
ez nagyobb, mint k”(0), így mozgatni a bal részfa.
A méret a bal részfa 0.
k”jelentése szintén 0 így a jelenlegi csomópontot kell a 4..
Az ötlet.