📄 rbtree.h
字号:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int status;
typedef int KeyType;//关键域数据类型;
typedef enum color
{
red,black
}color;
typedef struct RBTreeNode
{
KeyType key;
color clr;
struct RBTreeNode *parent;
struct RBTreeNode *lChild;
struct RBTreeNode *rChild;
}RBTreeNode,*pRBTreeNode;
status LeftRotate(RBTreeNode **tRoot,pRBTreeNode x)
{//左旋
if(x!=NULL&&x->rChild!=NULL)
{
pRBTreeNode y;
y=x->rChild;
x->rChild=y->lChild;
if(y->lChild!=NULL)
y->lChild->parent=x;
y->parent=x->parent;
if(x->parent==NULL)
{
(*tRoot)=y;
y->parent=NULL;
}
else if(x==x->parent->lChild)
x->parent->lChild=y;
else
x->parent->rChild=y;
y->lChild=x;
x->parent=y;
return OK;
}
else return FALSE;
}
status RightRotate(RBTreeNode **tRoot,pRBTreeNode y)
{//右旋
if(y!=NULL&&y->lChild!=NULL)
{
pRBTreeNode x=y->lChild;
y->lChild=x->rChild;
if(x->rChild!=NULL)
x->rChild->parent=y;
x->parent=y->parent;
if(y->parent==NULL)
{
(*tRoot)=x;
x->parent=NULL;
}
else if(y==y->parent->lChild)
y->parent->lChild=x;
else
y->parent->rChild=x;
x->rChild=y;
y->parent=x;
return OK;
}
else return FALSE;
}
status RBTInsertFixup(RBTreeNode **tRoot,pRBTreeNode z)
{//插入调整
pRBTreeNode y;
while(z->parent!=NULL&&z->parent->clr==red)
{
if(z->parent==z->parent->parent->lChild)
{
y=z->parent->parent->rChild;
if(y!=NULL&&y->clr==red)
{//情况1
z->parent->clr=black;
y->clr=black;
z->parent->parent->clr=red;
z=z->parent->parent;
}
else
{
if(z==z->parent->rChild)
{//情况2
z=z->parent;
LeftRotate(tRoot,z);
}
//情况3
z->parent->clr=black;
z->parent->parent->clr=red;
RightRotate(tRoot,z->parent->parent);
}
}
else
{
y=z->parent->parent->lChild;
if(y!=NULL&&y->clr==red)
{//情况4
z->parent->clr=black;
y->clr=black;
z->parent->parent->clr=red;
z=z->parent->parent;
}
else
{
if(z==z->parent->lChild)
{//情况5
z=z->parent;
RightRotate(tRoot,z);
}
//情况6
z->parent->clr=black;
z->parent->parent->clr=red;
LeftRotate(tRoot,z->parent->parent);
}
}
}
(*tRoot)->clr=black;
return OK;
}
status RBTInsert(RBTreeNode **tRoot,pRBTreeNode z)
{//红黑树插入
pRBTreeNode y=NULL;
pRBTreeNode x=*tRoot;
while(x!=NULL)
{
y=x;
if(z->key<x->key)
x=x->lChild;
else
x=x->rChild;
}
z->parent=y;
if(y==NULL)
{
*tRoot=z;
z->parent=NULL;
}
else if(z->key<y->key)
y->lChild=z;
else
y->rChild=z;
z->lChild=NULL;
z->rChild=NULL;
z->clr=red;
RBTInsertFixup(tRoot,z);
return OK;
}
status InorderRBTWalk(pRBTreeNode tRoot)
{//中序遍历
if(tRoot!=NULL)
{
InorderRBTWalk(tRoot->lChild);
printf("key=%d,",tRoot->key);
if(tRoot->clr==0)
printf("color:red ");
else
printf("color:black ");
InorderRBTWalk(tRoot->rChild);
}
return OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -