红黑树RBT基本概念与实现

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值