Se si hanno le dimensioni di ciascuno dei sottoalberi, questo può essere fattibile senza dover leggere i dati in una matrice (o altrimenti attraversare l'albero) e contando. Se non mantenere le informazioni formato pratico, avrete bisogno di una funzione di supporto per calcolare le dimensioni.
L'idea di base, capire qual è l'indice del nodo corrente. Se è minore di k, è necessario cercare la sottostruttura sinistra. Se è maggiore di k, cercare il diritto di compensazione i nodi contati da sinistra e corrente. Si noti che questo è essenzialmente lo stesso di ricerca attraverso un BST regolare, ma questa volta siamo alla ricerca per indice, non dati. Alcuni pseudocodice:
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
Per illustrare, considerare questo albero con gli indici segnati (non hanno nemmeno preoccuparsi dei dati non è importante nella ricerca):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Supponiamo di voler trovare il 2 ° (k = 2).
Partendo 3, la dimensione della sottostruttura sinistra è 3.
È maggiore di k così passare al sottoalbero sinistro.
La dimensione della sottostruttura sinistra è 2.
k è anche 2 in modo che il nodo corrente deve essere il secondo.
Supponiamo di voler trovare il 4 ° (k = 4).
Partendo 3, la dimensione della sottostruttura sinistra è 3.
È inferiore a L in modo regolare il nuovo k a 0 (k'= 4 - (3 + 1)) e spostarsi sottoalbero destro.
Partendo 6, la dimensione della sottostruttura sinistra è 2.
E è maggiore di k'(0) in modo da spostare il sottoalbero sinistro.
La dimensione della sottostruttura sinistra è 0.
k' è 0 quindi il nodo corrente deve essere il 4 °.
Si ottiene l'idea.