C语言动态构造红黑树

这篇博客展示了如何使用C语言动态构造红黑树,包括左旋、右旋和修复红黑树平衡的函数,以及插入节点的实现。通过核心代码解释了红黑树的插入过程,并提供了插入函数`insertTnode`的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

贴出核心代码和效果图。希望共同学习交流进步。

void leftRotate(Tnode* root,Tnode x){
    Tnode y = x->r;
    x->r = y->l;
    //y->l = x;
    if(y->l!=tnil)
    (y->l)->p = x;
    y->p = x->p;
    if(x==*root){
       *root = y;
    }else{
       if(x==(x->p)->l){
          (x->p)->l = y;
       }else if(x==(x->p)->r){
           (x->p)->r = y;
       }
    }
    y->l = x;
    x->p = y;
}
void rightRotate(Tnode* root,Tnode y){
     Tnode x = y->l;
     y->l = x->r;
     if(x->r!=tnil){
       (x->r)->p = y;
     }
     x->p = y->p;
     if(y==*root){
        *root = x;
     }else{
         if(y==(y->p)->r){
            (y->p)->r = x;
         }else{
            (y->p)->l = x;
         }
     }
     x->r = y;
     y->p = x;
}
void fixUp(Tnode* root,Tnode z){
        while((z->p)->color==1){
        if(z->p==((z->p)->p)->l){
           //情况1:叔节点为红色
            Tnode y = ((z->p)->p)->r;
            if(y->color==1){
                (z->p)->color = 0;
                 y->color = 0;
                 z = ((z->p)->p);
                 z->color = 1;
            }else{
                //2
                if(z==(z->p)->r){
                   z = z->p;
                   //进行左旋。转化为情况3
                   leftRotate(root,z);
                }
                //3
                (z->p)->color = 0;
                ((z->p)->p)->color = 1;
                rightRotate(root,(z->p)->p);
            }
        }else{
            //对称处理
            Tnode y = ((z->p)->p)->l;
            //情况4
            if(y->color==1){
              (z->p)->color = 0;
              y->color = 0;
              z = ((z->p)->p);
              z->color = 1;
            }else{
                //5
                if(z==(z->p)->l){
                   z = z->p;
                   rightRotate(root,z);
                }
               (z->p)->color = 0;
               ((z->p)->p)->color = 1;
               leftRotate(root,(z->p)->p);
            }
        }
        }
    (*root)->color = 0;
}
void insertTnode(Tnode* root,int key){
    Tnode z = (Tnode)malloc(sizeof(struct tnode));
    Tnode temp = *root;
    Tnode temp1 = temp;
    if(*root==NULL){
       *root = z;
       temp1 = tnil;
    }else{
        while(temp!=tnil){
            if(key>temp->key){
                temp1 = temp;
                temp = temp->r;
            }else{
                temp1 = temp;
                temp = temp->l;
            }
        }
        if(key>temp1->key){
           temp1->r = z;
        }else{
           temp1->l = z;
        }
    }
    z->p = temp1;
    z->r = tnil;
    z->l = tnil;
    z->key = key;
    z->color = 1;//设置为红色。以保证不会违反性质5
    fixUp(root,z);
}

 

效果图

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值