红黑树的代码实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//by svking
//2012.5
#include
#include
#include
#define MAXSIZE 1000
typedef int ElemType;
#define RED 0
#define BLACK 1
typedef struct RBTNode
{
char color;
ElemType data;
struct RBTNode * p;
struct RBTNode * left;
struct RBTNode * right;
}RBTNode, * PRBTNode;
typedef struct RBTree
{
PRBTNode root;
PRBTNode nil; //统一的空节点,该节点是黑的
}RBTree, * PRBTree;
int leftRotate (PRBTree tree, PRBTNode t);
int rightRotate (PRBTree tree, PRBTNode t);
PRBTNode insertRB (PRBTree tree, ElemType d);
int insertRB_fixup (PRBTree tree, PRBTNode t);
int createRBTree (PRBTree tree, ElemType d[], int n); int initRB (PRBTree tree);
PRBTNode maximum (PRBTree tree, PRBTNode t); PRBTNode minimum (PRBTree tree, PRBTNode t); PRBTNode next (PRBTree tree, PRBTNode t);
PRBTNode precursor (PRBTree tree, PRBTNode t);
int walkNext (PRBTree tree);
int inOrderWalk (PRBTree tree, PRBTNode t);
int deleteRB_fixup (PRBTree tree, PRBTNode c); PRBTNode deleteRB (PRBTree tree, PRBTNode t);
int main ()
{
PRBTNode p;
int d[MAXSIZE];
int n = 0;
int i;
RBTree tree;
initRB(&tree);
/*
insertRB(&tree, 11);
insertRB(&tree, 2);
insertRB(&tree, 14);
insertRB(&tree, 1);
insertRB(&tree, 7);
insertRB(&tree, 15);
insertRB(&tree, 5);
insertRB(&tree, 8);
insertRB(&tree, 4);
*/
p= insertRB(&tree, 26);
insertRB(&tree, 17);
insertRB(&tree, 41);
insertRB(&tree, 14);
insertRB(&tree, 21);
insertRB(&tree, 30);
insertRB(&tree, 47);
insertRB(&tree, 10);
insertRB(&tree, 16);
insertRB(&tree, 19);
insertRB(&tree, 23);
insertRB(&tree, 28);
insertRB(&tree, 38);
insertRB(&tree, 7);
insertRB(&tree, 12);
insertRB(&tree, 15);
insertRB(&tree, 20);
insertRB(&tree, 3);
insertRB(&tree, 35);
insertRB(&tree, 39);
srand(time(NULL));
/*
puts("请输入数据的个数:");
scanf("%d",&n);
printf("随机生成的%d个数据是:\n",n); for (i = 0; i < n; i++)
{
d[i] = rand()%1000;
printf("%d ",d[i]);
}
puts("");
puts("建树开始");
createRBTree(&tree, d, n);
*/
inOrderWalk(&tree,tree.root);
puts("");
printf("根是%d \n",tree.root->data);
printf("删除%d后:",p->data);
deleteRB(&tree, p);
inOrderWalk(&tree,tree.root);
puts("");
printf("根是%d \n",tree.root->data);
return0;
}
PRBTNode insertRB (PRBTree tree, ElemType d)
{//插入元素
//!!!记得插入的元素的初始化,p指向为父母节点,left和right赋值为NULL。
PRBTNode t = NULL;
PRBTNode p = NULL;
int flag = 0; //用来表示插入在左边的树还是右边的树
t = tree->root;
//插入的节点是root,并做相应的初始化
if (tree->root == tree->nil)
{
tree->root = (PRBTNode)malloc(sizeof(RBTNode));
tree->root->data = d;
tree->root->color = BLACK;
tree->root->p = tree->root->left =tree->root->right = tree->nil;
return tree->root;
}
while (t != tree->nil)
{
p = t;
if (d < t->data)
{