算法导论 红黑树的扩张 动态顺序统计

#include <stdio.h>    
#include <stdlib.h>    
#define RED 1    
#define BLACK 0    
    
typedef struct RBTreeNode    
{    
    int key;    
    int color; 
	int size;
    RBTreeNode *p;    
    RBTreeNode *left;    
    RBTreeNode *right;    
}RBT,*pRBT;    
    
pRBT nil=(pRBT)malloc(sizeof(RBT));    
int bh=0;  
  
void initNil()    
{    
    nil->key=-1;    
    nil->color=BLACK;    
    nil->p=NULL;    
    nil->left=NULL;    
    nil->right=NULL; 
	nil->size=0;
}    
    
void leftRotate(pRBT *root,pRBT x)    
{    
    //左旋要有右子树    
    if(x->right==nil)    
        return;    
    pRBT y=x->right;    
    x->right=y->left;    
    if(y->left != nil)    
        y->left->p=x;    
    y->p=x->p;    
    if(x->p==nil)    
    {    
        (*root)=y;    
    }    
    else if(x == x->p->left)    
    {    
        x->p->left=y;    
    }    
    else    
    {    
        x->p->right=y;    
    }    
    y->left=x;    
    x->p=y;   
	//维护子树数目
	y->size=x->size;
	x->size=x->left->size+x->right->size+1;
}    
    
void rightRotate(pRBT *root,pRBT x)    
{    
    //右旋要有左子树    
    if(x->left==nil)    
        return;    
    pRBT y=x->left;    
    x->left=y->right;
	if(y->right != nil)    
        y->right->p=x;
    y->p=x->p;    
    if(x->p==nil)    
    {    
        (*root)=y;    
    }    
    else if(x==x->p->left)    
    {    
        x->p->left=y;    
    }    
    else    
    {    
        x->p->right=y;    
    }    
    y->right=x;    
    x->p=y;   
	//维护子树数目
	x->size=y->size;
	y->size=y->left->size+y->right->size+1;
}    
    
void rbInsertFixup(pRBT *root,pRBT z)    
{    
    while(z->p->color=
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值