Das Finden der k-ten kleinsten Wert in einem BST

stimmen
0

Hier ist, was ich den k-ten kleinsten Wert in einem binären Suchbaum zu finden haben:

struct treeNode 
{
   int data;
   struct treeNode *left, *right:
};

int rank(stuct treeNode* ptr, int k)
{
   if(node == NULL)
    return root; 

   while(ptr->left != NULL) {
     ptr = ptr->left;
     return rank(ptr->left)
   }
}

Dies ist natürlich nicht richtig. Ohne die Lösung bereitstellt, könnte jemand mich führen in die richtige Richtung, wie ich dieses Problem lösen könnte? Ich habe Probleme, herauszufinden, wie ich das k-te kleinste Element in einem BST finden konnte.

Veröffentlicht am 03/05/2011 um 02:17
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Das sollte funktionieren:

int rank(struct treeNode* n,int k,int* chk)
    {
    if(!n) return -1;
    int _chk = 0;
    if(!chk) chk = &_chk;

    int t = rank(n->left,k,chk);
    if(t>=0) return t;

    if(++*chk > k) return n->data;

    int t = rank(n->right,k,chk);
    if(t>=0) return t;
    return -1;
    }

nennen als rank(root,k,0)

Beantwortet am 03/05/2011 um 02:35
quelle vom benutzer

stimmen
1

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.

Beantwortet am 03/05/2011 um 02:45
quelle vom benutzer

stimmen
5

Ein BST ist ein sortierte Binärbaum, eine In-Order-Traversal (linker Unterbaum, aktuelle Knoten der rechte Unterbaum) wird sortierten Knotenwerte geben. Um den k-ten kleinsten Knoten zu finden, gehen Sie nur eine In-Order Traversal mit einem Zähler. Der Zähler beginnt bei 0, wenn ein Knoten durchlaufen wird, erhöht sie um eins, wenn es k erreicht hat, wird der Knoten ist die k-te kleinste.

Beantwortet am 03/05/2011 um 02:47
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more