1. 基本概念
RBT的作用与平衡二叉树类似,目的是优化原始BST查找效率低的问题。RBT需成立,要满足如下条件:
- 树中每个节点有颜色(红或黑)
- 根节点必须为黑色
- NULL值处称为终端节点,我们可以认为是黑色
- 不允许两个红节点互为父子关系
- 从任意节点向下出发,到所有终端节点的各条路径上黑节点个数相同
2. RBT节点添加
向RBT添加节点,该节点默认初始化为红色。(若为黑色则第五个条件不满足,若为红色可能不满足第四个条件,但第五个条件不好调控,所以选择红色。)
添加步骤如下图:
3. RBT节点删除
代码实现:
#include<stdio.h>
#include<stdlib.h>
enum COLOR{
RED,BLACK};
typedef struct rbt
{
int nValue;
int nColor;
struct rbt *pLeft;
struct rbt *pRight;
struct rbt *pFather;
}RBT;
RBT *pRBT = NULL;
void RightRotate(RBT **pTree)
{
if(*pTree == NULL || (*pTree)->pLeft == NULL)return;
RBT *pNode = *pTree;
RBT *pMark = pNode->pLeft;
//三个孩子关系
pNode->pLeft = pMark->pRight;
pMark->pRight = pNode;
if(pNode->pFather != NULL)
{
if(pNode == pNode->pFather->pLeft)
{
pNode->pFather->pLeft = pMark;
}
else
{
pNode->pFather->pRight = pMark;
}
}
else
{
//换根
pRBT = pMark;
}
//三个父亲关系
if(pNode->pLeft != NULL)
{
pNode->pLeft->pFather = pNode;
}
pMark->pFather = pNode->pFather;
pNode->pFather = pMark;
}
void LeftRotate(RBT **pTree)
{
if(*pTree == NULL || (*pTree)->pRight == NULL)return;
RBT *pNode = *pTree;
RBT *pMark = pNode->pRight;
//三个孩子关系
pNode->pRight = pMark->pLeft;
pMark->pLeft = pNode;
if(pNode->pFather != NULL)
{
if(pNode == pNode->pFather->pLeft)
{
pNode->pFather->pLeft = pMark;
}
else
{
pNode->pFather->pRight = pMark;
}
}
else
{
//换根
pRBT = pMark;
}
//三个父亲关系
if(pNode->pRight != NULL)
{
pNode->pRight->pFather = pNode;
}
pMark->pFather = pNode->pFather;
pNode->pFather = pMark;
}
RBT *Search(RBT *pTree,int nNum)
{
if(pTree == NULL)return NULL;
while(pTree)
{
if(pTree->nValue > nNum)
{
//左侧
if(pTree->pLeft == NULL)
{
return pTree;
}
pTree = pTree->pLeft;
}
else if(pTree->nValue < nNum