Comment trouver le rang d'un noeud dans un arbre AVL?

voix
4

Je dois mettre en œuvre deux requêtes de rang [ rank(k)et select(r)]. Mais avant que je puisse commencer à ce sujet , je dois comprendre comment fonctionnent les deux fonctions.

Pour autant que je sache, rank(k)retourne le rang d'une clé donnée k, et select(r)renvoie la clé d'un rang donné r.

Mes questions sont les suivantes:

1.) Comment calculer le rang d'un noeud dans un AVL (auto équilibrage BST)?

2.) Est - il possible de plus d'une clé pour avoir le même rang? Et si oui, qu'est - ce woulud select(r)retour?

Je vais inclure un arbre échantillon de AVL que vous pouvez consulter si elle aide à répondre à la question.

entrez

Merci!

Créé 28/02/2011 à 03:40
source utilisateur
Dans d'autres langues...                            


4 réponses

voix
3

Votre question se résume à: « comment est le terme « rang » normalement défini par rapport à un arbre AVL? » (Et, peut-être, comment est « select » normalement défini ainsi).

Au moins comme je l'ai vu le terme utilisé, « rang », la position parmi les noeuds de l'arbre - à savoir, combien de nœuds sont à sa gauche. Vous êtes généralement donné un pointeur vers un noeud (ou peut-être une valeur clé) et vous devez compter le nombre de nœuds à sa gauche.

« Select » est essentiellement le contraire - que vous avez donné un rang particulier, et que vous devez récupérer un pointeur vers le noeud spécifié (ou la clé de ce noeud).

Deux notes: Tout d'abord, puisque aucun de ces arbres modifie le tout, il ne fait aucune différence réelle quelle forme d'équilibre est utilisé (par exemple, par rapport à AVL rouge / noir); d'ailleurs un arbre sans équilibrage du tout est équivalent aussi bien. Deuxièmement, si vous devez le faire fréquemment, vous pouvez améliorer la vitesse considérablement en ajoutant un champ supplémentaire à chaque nœud enregistrent le nombre de noeuds sont à sa gauche.

Créé 28/02/2011 à 04:07
source utilisateur

voix
1

Rang est le nombre de noeuds dans l'arborescence de gauche sous plus un, et est calculé pour chaque nœud. Je crois que le rang est pas un concept spécifique aux arbres AVL - il peut être calculé pour tout arbre binaire.

Select est juste en face de classement. Un rang est donné et vous devez retourner un correspondant de noeud rang.

Le code suivant effectue le calcul de rang:

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));
        }
}
Créé 30/08/2013 à 10:13
source utilisateur

voix
0

Voici le code que j'ai écrit et a bien fonctionné pour AVL arbre pour obtenir le rang d'une valeur particulière. la différence est que vous avez utilisé un nœud en tant que paramètre et i utilisé une clé d'un paramètre. vous pouvez modifier comme votre propre chemin. Exemple de code:

    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] Si vous voulez démarrer votre rang de 0 puis initialiser rang variable = 0. vous devriez certainement avoir mis en œuvre la méthode countNodes () pour exécuter ce code.

Créé 08/09/2015 à 20:14
source utilisateur

voix
-1

Voici ce que je l'ai fait. Dans mon programme le rang d'un élément est défini comme étant le 1+ (pas d'éléments plus que cet élément). Vous pouvez noter ici que l'élément ne doit pas présent dans l'arbre.

Algorithme pour trouver rang:

1.In la structure de l'arbre garder une trace du pas d'éléments dans un arbre sous y compris la racine. Ainsi, la tête de la volonté de l'arbre contient des éléments totaux dans l'arborescence.

2.Compare l'élément avec un noeud, si elle est inférieure à celle du noeud, alors il y a (1 + Nbr éléments enfant droit) des éléments supérieurs à la clé il element.Add au total et rechercher de manière récursive l'élément dans la enfant gauche.

3. Si l'élément est supérieur au nœud racine puis il suffit de chercher l'élément récursive de l'enfant droit. (Pas besoin d'ajouter quoi que ce soit puisque nous négligeons l'arbre gauche, où tous les éléments sont inférieurs à la clé donnée)

4.Terminate l'algo lorsque vous trouvez l'élément sont atteint nulle.

Le programme donné ne renvoie pas d'éléments supérieurs à la clé donnée. 1+ la valeur retournée est le rang.

extrait de code:

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);
   }

J'espère que cela t'aides :)

Créé 03/10/2015 à 16:52
source utilisateur

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