Si vous avez la taille de chacun des sous-arbres, cela peut être faisable sans avoir à lire les données dans un tableau (ou autrement traversant l'arbre) et de comptage. Si vous ne gardez pas les informations de taille à portée de main, vous aurez besoin d'une fonction d'assistance pour calculer la taille.
L'idée de base, comprendre ce qui est l'indice du noeud courant. Si elle est inférieure à k, vous devez rechercher le sous-arbre gauche. Si elle est supérieure à k, rechercher le droit de compenser les nœuds comptés à partir de la gauche et du courant. Notez que ceci est essentiellement la même que la recherche par un BST régulière, sauf que cette fois nous sommes à la recherche par index, pas de données. Certains pseudo-code:
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
Pour illustrer ceci, cet arbre avec les indices marqués (ne vous inquiétez même pas les données comme il est pas important dans la recherche):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Supposons que nous voulons trouver le 2ème (k = 2).
À partir de 3, la taille du sous - arbre gauche est 3.
Il est supérieur à k donc passer à la sous - arbre gauche.
La taille du sous - arbre gauche est 2.
k est 2 de sorte que le nœud actuel doit être le 2ème.
Supposons que nous voulons trouver le 4ème (k = 4).
A partir de trois, la taille du sous - arbre gauche est égal à 3.
Il est donc inférieur à l ajuster le nouveau k soit 0 (k »= 4 - (3 + 1)) et passer à la sous - arbre droit.
À partir de 6, la taille du sous - arbre gauche est 2.
Il est supérieur à k »(0) donc passer à la sous - arbre gauche.
La taille du sous - arbre gauche est 0.
k » est 0 si le nœud actuel doit être le 4ème.
Vous avez eu l'idée.