笔者近来学习了一下红黑树,写出了初步代码。分享出来,同时这个代码并不保证没有bug,所以摆出来希望经过一番磨练。
#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
// 定义颜色
typedef enum ColorType {RED,BLACK} COLOR;
#define datatype int
typedef struct RBtree
{
COLOR color;
datatype data;
struct RBtree *parent;
struct RBtree *lchild, *rchild;
}RBtree;
// 包含一棵树的root指针和nil尾指针
typedef struct rbtree_rootandnil
{
RBtree *root;
RBtree *nil;
}TreeRN;
/*------函数声明------*/
TreeRN *initRBTree();
TreeRN *insertRBtreeFixup(TreeRN *T, RBtree *r);
TreeRN *insertRNtree(TreeRN *T, datatype i);
TreeRN *rightRotate(TreeRN *T, RBtree *r);
TreeRN *leftRotate(TreeRN *T, RBtree *r);
TreeRN *RBtransplant(TreeRN *T, RBtree *original, RBtree *replace);
TreeRN *RBtreeDeleteFix(TreeRN *T, RBtree *x);
TreeRN *RBtreeDelete(TreeRN *T, RBtree *r);
/*--------------------*/
/**********************
函数用途:初始化一棵红黑树
返回值 :树T
**********************/
TreeRN *initRBTree()
{
TreeRN *T = (TreeRN *)malloc(sizeof(TreeRN));
T->nil = (RBtree *)malloc(sizeof(RBtree));
T->nil->color = BLACK;
T->nil->parent = NULL;
T->nil->rchild = T->nil->lchild = NULL;
T->root = T->nil;
return T;
}
/**********************
函数用途:以某一结点进行左旋
返回值 :树T
**********************/
TreeRN *leftRotate(TreeRN *T, RBtree *r)
{
RBtree *y = r->rchild;
r->rchild = y->lchild;
if (y->lchild != T->nil)
y->lchild->parent = r;
y->parent = r->parent;
if (r->parent == T->nil)
T->root = y;
else if (r ==