Wenn Sie die Größen von jedem der Teilbäume haben, kann dies machbar sein, ohne dass die Daten in ein Array (oder auf andere Weise durchqueren den Baum) und das Zählen bis zu lesen. Wenn Sie nicht die Größeninformationen handlich halten, werden Sie eine Hilfsfunktion müssen die Größe zu berechnen.
Die Grundidee, herauszufinden, was der Index des aktuellen Knotens ist. Wenn es weniger als k ist, müssen Sie den linken Unterbaum suchen. Wenn sie größer als k ist, suchen Sie sich das Recht vor, die die Knoten Verrechnung von links und Strom gezählt. Beachten Sie, dass diese im Wesentlichen das gleiche ist durch eine regelmäßige BST wie die Suche, außer diese Zeit, die wir durch den Index suchen, keine Daten. Einige 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
Zur Veranschaulichung betrachtet diesen Baum mit dem markierten Indizes (keine Sorge, auch über die Daten, wie sie bei der Suche nicht wichtig sind):
3
/ \
2 6
/ / \
0 4 7
\ \
1 5
Angenommen , wir die 2. (k = 2) finden möchten.
Ab 3 ist die Größe des linken Unterbaumes 3.
Es ist größer als k so nach links subtree bewegen.
Die Größe des linken Unterbaums ist 2.
k ist auch 2 so der aktuelle Knoten der zweite sein.
Angenommen , wir die 4. (k = 4) finden möchten.
Ab 3 ist die Größe des linken Unterbaumes 3.
Es ist weniger als l , so die neuen k einzustellen seine 0 (k‘= 4 - (3 + 1)) nach rechts Teilstruktur und bewegen.
Beginnend bei 6, die Größe des linken Unterbaums ist 2.
Es ist größer als k‘(0) so nach links subtree bewegen.
Die Größe des linken Unterbaums ist 0.
k‘ist auch 0 , so der aktuelle Knoten die vierte sein muss.
Du hast die Idee.