⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rbtree.h

📁 数据结构中红黑树的C语言实现
💻 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 + -