Question

Chaque fois que j'utiliser cette fonction ma avlRotate, il laisse tomber certains éléments de l'arbre. z est le noeud dans lequel le déséquilibre a été détectée, y est son noeud de sous-arbre ayant la plus grande hauteur, x est le noeud nouvellement inséré. Cette fonction est appelée immédiatement après une seule insertion.

#define RESTRUCTURE  a->left = t0; a->right = t1; c->left = t2; c->right = t3; b->left = a; b->right = c;

avlTree avlRotate(avlTree z,avlTree y,avlTree x)
{
    avlTree a,b,c;  
    avlTree t0,t1,t2,t3;

    if(y==z->left && x==y->left)  //single rotation
    {
        a=x;b=y;c=z;
        t0=a->left;
        t1=a->right;
        t2=b->right;
        t3=c->right;
        RESTRUCTURE
        c->height[0] = y->height[1];

    }
    else if(y==z->right && x==y->right) //single rotation
    {
        a=z;b=y;c=x;
        t0=a->left;
        t1=b->left;
        t2=c->left;
        t3=c->right;
        RESTRUCTURE
        a->height[1] = y->height[0];

    }
    else if(y==z->right && x==y->left)  //double rotation
    {
        a=z;b=x;c=y;
        t0=a->left;
        t1=b->left;
        t2=b->right;
        t3=c->right;
        RESTRUCTURE
        a->height[1] = x->height[0];
        c->height[0] = x->height[1];
    }
    else if(y==z->left && x==y->right)  //double rotation
    {
        a=y;b=x;c=z;
        t0=a->left;
        t1=b->left;
        t2=b->right;
        t3=c->right;
        RESTRUCTURE
        a->height[1] = x->height[0];
        c->height[0] = x->height[1];    
    }

    printf("\nRem parts:\n");
    printf("{%d %d} {%d %d} {%d %d}\n",a->part->range[0],a->part->range[1],b->part->range[0],b->part->range[1],c->part->range[0],c->part->range[1]);
    printf("\n\n");

    b->height[0] = ( (a->height[0] > a->height[1]) ? (a->height[0])+1 : (a->height[1])+1 ); 
    b->height[1] = ( (c->height[0] > c->height[1]) ? (c->height[0])+1 : (c->height[1])+1 ); 
    a->balFactor = a->height[0] - a->height[1];
    b->balFactor = b->height[0] - b->height[1];
    c->balFactor = c->height[0] - c->height[1]; 
    return(b);
}

La fonction est appelée avec:

if(a->balFactor > 1 || a->balFactor < -1)
    {
        printf("imbalance fside=%d pside=%d\n",*finalSide,*prevSide);

        if(*finalSide == 0)
        {yLike = a->left;}
        else
        {yLike = a->right;}
        if(*prevSide == 0)
        {xLike = yLike->left;}
        else
        {xLike = yLike->right;}
        printf("passing to rotate %u %u %u\n",a,yLike,xLike);
        printf("{%d %d} {%d %d} {%d %d}\n",a->part->range[0],a->part->range[1],yLike->part->range[0],yLike->part->range[1],xLike->part->range[0],xLike->part->range[1]);
        a = avlRotate(a,yLike,xLike);
        avlInOrderTraversal(a,0);           
        printf("{%d %d} {%d %d} {%d %d}\n",a->left->part->range[0],a->left->part->range[1],a->part->range[0],a->part->range[1],a->right->part->range[0],a->right->part->range[1]);
    }

dans la fonction d'insertion.

Sortie:

a->height[0]=1 a->height[1]=0
BALANCE FACTOR = 1



    16 to 18
51 to 53



a->height[0]=0 a->height[1]=1
BALANCE FACTOR = -1
a->height[0]=2 a->height[1]=0
BALANCE FACTOR = 2
imbalance fside=0 pside=1
passing to rotate 147992552 147992584 147992616
{51 53} {16 18} {41 41}

Rem parts:
{16 18} {41 41} {51 53}





51 to 53



a->height[0]=0 a->height[1]=1
BALANCE FACTOR = -1



51 to 53
    60 to 61



a->height[0]=1 a->height[1]=1
BALANCE FACTOR = 0



    4 to 6
51 to 53
    60 to 61

est quelque chose évidemment incorrect avec cette fonction?

Remarque: Chaque nœud stocke une plage, par exemple. 3 to 5.

Était-ce utile?

La solution

Ecrire une fonction pour vider votre arbre. Pour chaque nœud, l'affichage ce qu'il pense de sa gauche, à droite, et les profondeurs de sous-arbre gauche / droite sont.

Dump l'arbre avant une rotation, puis par la suite.

C'est ce que je faisais quand je le mien écrit.

-Are- va avoir des bugs subtils dans l'arbre - le recours à SO sur chaque problème vous mènera nulle part rapidement. Vous allez également avoir besoin d'une fonction de vidage de débogage rééquilibrage que vous montez l'arbre - il y a un certain nombre de cas de rééquilibrage unique pour ajouter et supprimer que vous devez vérifier. Tout cela nécessite une décharge d'arbre.

Autres conseils

Il existe de nombreuses ressources sur l'arbre AVL dans le web, quelques élus sont:

  1. http://en.wikipedia.org/wiki/AVL_tree
  2. la mise en œuvre de C: http://www.stanford.edu/~blp/ AVL / libavl.html
  3. Animation : http: / /www.cs.jhu.edu/~goodrich/dsa/trees/avltree.html
  4. Animation : http: //www.strille .net / travaux / media_technology_projects / AVL-tree_2001 /

Continuer réponse Blank plus , je suggère à comparer la sortie de vidage de votre programme avec les résultats d'animation .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top