Wie in den Rang eines Knotens in einem AVL-Baum zu finden?

stimmen
4

Ich brauche zwei Rang - Abfragen zu implementieren [ rank(k)und select(r)]. Aber bevor ich auf diese beginnen kann, muss ich herausfinden , wie die beiden Funktionen arbeiten.

Soweit ich weiß, rank(k)gibt den Rang eines gegebenen Schlüssel kund select(r)gibt den Schlüssel eines bestimmten Rang r.

Also meine Fragen sind:

1.) Wie berechnet man den Rang eines Knotens in einem AVL (Selbstausgleich BST)?

2.) Ist es möglich , mehr als ein Schlüssel den gleichen Rang zu haben? Und wenn ja, was woulud select(r)zurückkehren?

Ich werde eine Probe AVL-Baum umfassen, die Sie sich beziehen können, wenn es um die Frage hilft zu beantworten.

Geben

Vielen Dank!

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


4 antworten

stimmen
3

Ihre Frage wirklich darauf an: „Wie ist der Begriff‚Rang‘in der Regel in Bezug auf einen AVL-Baum definiert?“ (Und gegebenenfalls, wie ist ‚wählen‘ in der Regel so gut definiert).

Zumindest, wie ich der Begriff verwendet, gesehen habe „Rang“ bezeichnet die Position zwischen den Knoten im Baum - das heißt, wie viele Knoten sind zu ihrer Linken. Sie sind typischerweise einen Zeiger auf einen Knoten (oder vielleicht ein Schlüsselwert) gegeben, und Sie müssen die Anzahl der Knoten auf der linken zählen.

„Select“ ist im Grunde das Gegenteil - Sie einen bestimmten Rang gegeben, und brauchen einen Zeiger auf den angegebenen Knoten (oder den Schlüssel für diesen Knoten) abzurufen.

Zwei Anmerkungen: Erstens, da keiner dieser ändert der Baum überhaupt, es macht keinen Unterschied, welche Form der Bilanzierung verwendet wird (zB AVL gegen rot / schwarz); was das betrifft überhaupt ein Baum ohne Ausgleich ist auch gleichwertig. Zweitens, wenn Sie diese benötigen häufig zu tun, können Sie Geschwindigkeit erheblich verbessern, indem ein zusätzliches Feld zu jedem Knoten hinzugefügt Aufzeichnung, wie viele Knoten zu seiner linken Seite.

Beantwortet am 28/02/2011 um 04:07
quelle vom benutzer

stimmen
1

Rang ist die Anzahl der Knoten in der linken Unterbaum plus eins ist, und ist für jeden Knoten berechnet wird. Ich glaube, Rang ist kein Konzept speziell für AVL-Bäume - es kann für jeden binären Baum berechnet werden.

Wählen Sie direkt gegenüber Rang. Ein Rang gegeben und Sie haben einen Knoten passende zurückzuversetzen Rang.

Der folgende Code wird Rang Berechnung durchführen:

void InitRank(struct TreeNode *Node)
{
        if(!Node)
        {
                return;
        }
        else
        {       Node->rank = 1 + NumeberofNodeInTree(Node->LChild);
                InitRank(Node->LChild);
                InitRank(Node->RChild);
        }

}


int NumeberofNodeInTree(struct TreeNode *Node)
{
        if(!Node)
        {
                return 0;
        }
        else
        {
                  return(1+NumeberofNodeInTree(Node->LChild)+NumeberofNodeInTree(Node->RChild));
        }
}
Beantwortet am 30/08/2013 um 10:13
quelle vom benutzer

stimmen
0

Hier ist der Code, den ich schrieb und arbeitete gut für AVL-Baum, um den Rang eines bestimmten Wertes. Unterschied ist nur verwendet, um Sie einen Knoten als Parameter und i verwendet, um einen Schlüssel ein Parameter. Sie können dies als eigene Art und Weise ändern. Beispielcode:

    public int rank(int data){
    return rank(data,root);
}

private int rank(int data, AVLNode r){
    int rank=1;
    while(r != null){
        if(data<r.data)
            r = r.left;
        else if(data > r.data){
            rank += 1+ countNodes(r.left);
            r = r.right;
        }
        else{
            r.rank=rank+countNodes(r.left);
            return r.rank;
        }
    }
    return 0;
}

[NB] Wenn Sie Ihren Rang von 0 beginnen dann Variable Rang initialisieren = 0. Sie sollten auf jeden Fall die Methode countNodes () implementiert haben diesen Code auszuführen.

Beantwortet am 08/09/2015 um 20:14
quelle vom benutzer

stimmen
-1

Hier ist, was ich getan habe. In meinem Programm wird der Rang eines Elements definiert als 1+ (keine Elemente größer ist als das Element). Sie können hier beachten Sie, dass das Element nicht im Baum darstellen muss.

Algorithmus finden Rang:

1.In der Baumstruktur Spur der Anzahl der Elemente in einer Unterstruktur hält die Wurzel enthält. So ist der Kopf des Baumes Willen enthält insgesamt Elemente in dem Baum.

2.Compare das Element mit einem Knoten, wenn er kleiner ist als der Knoten ist, dann gibt es (1 + Anzahl Elemente in rechten Kind) Elemente größer ist als die Taste, um die Gesamt element.Add und die Suche rekursiv das Element in der linkes Kind.

3. Wenn das Element größer ist als der Wurzelknoten ist dann suchen Sie einfach das Element rekursiv in dem richtigen Kind. (Keine Notwendigkeit, etwas hinzuzufügen, da wir den linken Baum vernachlässigen, in der alle Elemente sind kleiner als die gegebene Taste)

4.Terminate die algo, wenn Sie das Element finden erreicht null.

Das gegebene Programm gibt keine Elemente größer als die angegebenen Schlüssel. 1+ der zurückgegebene Wert ist der Rang.

Code-Auszug:

int AVLUtils::rank(Node *root,long long val)
  {
    int n_ele_greater=0;
    int rank =0;

    if(root == NULL)
    return 0;
   if(val < root->key)
     {
    n_ele_greater = 1+this->n_elements(root->right_child)+this->rank(root->left_child,val);
     }
   else if(val > root->key)
     {
    n_ele_greater=this->rank(root->right_child,val);
    }

    else if(val == root->key)
    {
    return(this->n_elements(root->right_child));
    }
    return(n_ele_greater);
   }

Hoffe das hilft :)

Beantwortet am 03/10/2015 um 16:52
quelle vom benutzer

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