Jeśli masz rozmiary każdego z poddrzew, może to być wykonalne bez konieczności odczytywania danych do tablicy (lub inaczej przejeżdżające drzewo) i liczenie. Jeśli nie przechowywać informacje o rozmiarze poręczne, musisz funkcję pomocniczą do obliczania wielkości.
Podstawową ideą, dowiedzieć się, co jest wskaźnikiem bieżącego węzła. Jeżeli jest ona mniejsza niż k, trzeba szukać lewego poddrzewa. Jeżeli jest ona większa niż k, szukaj sobie prawo kompensowania węzły liczony od lewej strony i prądu. Zauważ, że to jest w zasadzie taki sam jak przeszukując regularnie BST, z wyjątkiem tej chwili szukamy przez indeks, a nie danych. Niektóre Pseudokod:
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
Aby zilustrować, rozważ to drzewo z oznaczonych indeksami (nawet nie martwić się o dane, gdyż nie jest ważne w wyszukiwaniu):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Załóżmy, że chcemy znaleźć 2nd (k = 2).
Począwszy od 3, wielkość lewego poddrzewa wynosi 3.
Jest większy niż k więc przejść do lewego poddrzewa.
Wielkość lewym poddrzewie jest 2.
k jest również 2 tak bieżący węzeł musi być 2nd.
Załóżmy, że chcemy znaleźć się 4 (k = 4).
Zaczynając od 3, wielkość lewej poddrzewem wynosi 3.
Jest to mniej niż l, aby ustawić nową k wynosi 0 (k”= 4 - (3 + 1)) i przenieść do odpowiedniej poddrzewem.
Począwszy od 6, wielkość lewego poddrzewa to 2.
Jest większy niż k”(0) więc przejść do lewego poddrzewa.
Wielkość lewym poddrzewie jest 0.
k”jest 0 więc bieżący węzeł musi być 4..
Masz pomysł.