【问题标题】:Insertion in a RED BLACK TREE with a common sentinal插入带有共同哨兵的红黑树
【发布时间】:2018-06-17 19:22:13
【问题描述】:

我在 c 中实现了 2 个函数:

  1. Client* insertABR(Client* sentinelle, int numeroTel, int prixAppel):它允许我在插入二叉搜索树时插入红黑树而不考虑颜色。(它工作正常)。
  2. Client* insert(Client* sentinelle, int numeroTel, int prixAppel):这个函数可以让我修复之前的插入。

我的结构客户端如下:

     typedef enum {  RED=0, BLACK=1 } Color; 
     struct sClient
    {
    int num_tel;
    int nbr_appel;
    double cout;
    struct sClient *fg; // left
    struct sClient *fd; //right 
    Color col;
    struct sClient *pere; //parent
    };
    typedef struct sClient Client;

这棵红黑树的特点是它有一个共同的哨兵,如图所示:enter image description here 树的根(拉辛)是哨兵的左儿子 fils gauche = 左儿子,fils droit = 右儿子。

    Client* insert(Client* sentinelle, int numeroTel, int prixAppel){
    Client *s,*c,*y;
    s=sentinelle;
    if(sentinelle == NULL){
                   sentinelle= createNode(0,0,0,1);
                   c= createNode(numeroTel, 1, prixAppel,1);
                   sentinelle->fg=c;
                   c->pere=sentinelle; 
                   c->fg=sentinelle;
                   c->fd=sentinelle;
                   return sentinelle;
                   }
    else{  



        c=insertABR(sentinelle, numeroTel, prixAppel); 

         while(((c->pere != s) && (c->pere->col==0))  ){

           if(grand_pere(c)->fg == c->pere){
                        //grand_pere= grand_father      
                        y= grand_pere(c)->fd;


                        if(y->col ==0){

                        c->pere->col =1;      
                        y->col =1;
                        grand_pere(c)->col =0;
                        c=grand_pere(c); 
                        }
                        else{
                             if(c==c->pere->fd) {
                                                c=c->pere; 
                                                left_rotate(c); 
                                                }
                              c->pere->col =1;
                              grand_pere(c)->col= 0;
                              right_rotate(grand_pere(c));             
                             }
                        }



                        else{
                          y=grand_pere(c)->fg; 
                             if(y->col ==0){
                               c->pere->col =1;
                               y->col =1;
                               grand_pere(c)->col =0;
                               c=grand_pere(c); 
                        } 
                        else{
                             if(c==c->pere->fg) {
                                                c=c->pere; 
                                                right_rotate(c); 
                                                }
                              c->pere->col =1;
                              grand_pere(c)->col= 0;
                              left_rotate(grand_pere(c));                   
                             }                   

                             }


    } 
    sentinelle->fg->col=1;

    return sentinelle;

    }
    }

我的问题是当我尝试插入 8、18、10、19、29、15 时,我得到了这个结果:

8(BLACK) 和 19(RED) 的根 10(BLACK) 父级。 19 是 29(BLACK) 和 18(BLACK) 的父代。 AND 18 是 15(RED) 的父级。 颜色很好但是树不平衡了,就像错过了一个旋转但我不知道在哪里添加它。

【问题讨论】:

    标签: c algorithm


    【解决方案1】:

    你的问题就在这里(在相应的情况下,父母是正确的孩子):

    if(c == c->pere->fd)
                        {
                            c = c->pere;
                            left_rotate(c);
                        }
    
                        c->pere->col = 1;
                        grand_pere(c)->col = 0;
                        right_rotate(grand_pere(c));
    

    必须是:

    if(c == c->pere->fd)
                            left_rotate(c);
                        else
                            c = c->pere;
    
                        c->col = 1;
                        c->pere->col = 0;
                        right_rotate(c)->pere;
    

    现在你改变 c 在相反方向的情况下指向的位置,当它们相同时(即左孩子的左孩子),当这两个动作需要向后时,不要理会它。

    【讨论】:

    • 我仍然有相同的结果
    • 此代码适用于右孩子(fd),当我尝试更新左孩子部分时,现在进程已停止
    • 我认为我的轮换程序有问题
    猜你喜欢
    • 2014-09-23
    • 2018-11-06
    • 2013-11-17
    • 2015-05-18
    • 2020-12-02
    • 2013-02-28
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多