#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=
算法导论 红黑树的扩张 动态顺序统计
最新推荐文章于 2020-07-08 10:47:23 发布
本文详细介绍了红黑树的左旋、右旋操作,并展示了红黑树节点插入后的修复过程,同时提供了红黑树节点删除的实现,包括删除修复。此外,还实现了动态顺序统计,用于查找指定位置的节点及其在树中的位置。
摘要由CSDN通过智能技术生成