根据之前红黑树的原理和《算法导论》上面的伪代码,我用代码将增加和调整的代码实现了一下,如有不对请大家指正。代码可以结合前两篇文章看。
/*
* =====================================================================================
*
* Filename: rbtree->h
*
* Description: red black tree
*
* Version: 1->0
* Created: 2014年05月05日 08时48分50秒
* Revision: none
* Compiler: gcc
*
* Author: 我叫程序猿XXX
* Company:
*
* =====================================================================================
*/
#ifndef __RBTREE__H
#define __RBTREE__H
#define bool int
#define successed 0
#define failed -1
#define BLACK 0
#define RED 1
typedef struct _rbtree_node{
struct _rbtree_node *p;
struct _rbtree_node *left;
struct _rbtree_node *right;
int key;
int color;
}*p_rbtree_node;
struct _rbtree_node node;
p_rbtree_node getNode(p_rbtree_node x);
bool leftRotate(p_rbtree_node *root, p_rbtree_node x);
bool rightRotate(p_rbtree_node *root, p_rbtree_node x);
bool rbInert(p_rbtree_node *root, p_rbtree_node z);
bool rbInsertFixup(p_rbtree_node *root, p_rbtree_node z);
bool rbBuilt(void);
void rbDisplay(p_rbtree_node *root);
void Display(void);
#endif/*
* =====================================================================================
*
* Filename: rbtree.c
*
* Description:
*
* Version: 1.0
* Created: 2014年05月05日 09时01分00秒
* Revision: none
* Compiler: gcc
*
* Author: 我叫程序猿XXX
* Company:
*
* =====================================================================================
*/
#include "rbtree.h"
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
p_rbtree_node nil = &node;
p_rbtree_node root;
p_rbtree_node getNode(p_rbtree_node x)
{
x = NULL;
x = (p_rbtree_node)malloc(sizeof(struct _rbtree_node));
if (x == NULL)
{
return NULL;
}
memset(x, 0, sizeof(struct _rbtree_node));
return x;
}
bool leftRotate(p_rbtree_node *root, p_rbtree_node x)
{
p_rbtree_node y = NULL;
y = x->right; //set y
x->right = y->left;
if (y->left != nil)
y->left->p = x;
y->p = x->p;
if (x->p == nil)
*root = y;
else if (x == x->p->left)
x->p->left = y;
else
x->p->right = y;
y->left = x;
x->p = y;
return successed;
}
bool rightRotate(p_rbtree_node *root, p_rbtree_node x)
{
p_rbtree_node y = NULL;
y = x->left;
x->left = y->right;
if (y->right != nil)
y->right->p = x;
y->p = x->p;
if (x->p == nil)
*root = y;
else if (x == x->p->left)
x->p->left = y;
else
x->p->right = y;
y->right = x;
x->p = y;
return successed;
}
bool rbInsert(p_rbtree_node *root, p_rbtree_node z)
{
p_rbtree_node y = nil;
p_rbtree_node x = *root;
while (x != nil)
{
y = x;
if (z->key < x->key)
x = x->left;
else
x = x->right;
}
z->p = y;
if (y == nil)
{
*root = z;
}
else if (z->key < y->key)
y->left = z;
else
y->right = z;
z->left = nil;
z->right = nil;
z->color = RED;
rbInsertFixup(root, z);
return successed;
}
bool rbInsertFixup(p_rbtree_node *root, p_rbtree_node z)
{
while (z->p->color == RED)
{
p_rbtree_node y = NULL;
if (z->p == z->p->p->left)
{
y = z->p->p->right;
if (y->color == RED)
{
z->p->color = BLACK;
y->color = BLACK;
z->p->p->color = RED;
z = z->p->p;
}
else if (z == z->p->right)
{
z = z->p;
leftRotate(root, z);
}
else
{
z->p->color = BLACK;
z->p->p->color = RED;
rightRotate(root, z->p->p);
}
}
else
{
y = z->p->p->left;
if (y->color == RED)
{
z->p->color = BLACK;
y->color = BLACK;
z->p->p->color = RED;
z = z->p->p;
}
else if (z == z->p->left)
{
z = z->p;
rightRotate(root, z);
}
else
{
z->p->color = BLACK;
z->p->p->color = RED;
leftRotate(root, z->p->p);
}
}
}
(*root)->color = BLACK;
return successed;
}
bool rbBuilt()
{
node.p = NULL;
node.left = NULL;
node.right = NULL;
node.key = -1;
node.color = BLACK;
root = nil;
p_rbtree_node n1 = getNode(n1);
n1->key = 1;
rbInsert(&root, n1);
p_rbtree_node n2 = getNode(n2);
n2->key = 2;
rbInsert(&root, n2);
p_rbtree_node n4 = getNode(n4);
n4->key = 4;
rbInsert(&root, n4);
p_rbtree_node n5 = getNode(n5);
n5->key = 5;
rbInsert(&root, n5);
p_rbtree_node n7 = getNode(n7);
n7->key = 7;
rbInsert(&root, n7);
p_rbtree_node n8 = getNode(n8);
n8->key = 8;
rbInsert(&root, n8);
p_rbtree_node n11 = getNode(n11);
n11->key = 11;
rbInsert(&root, n11);
p_rbtree_node n14 = getNode(n14);
n14->key = 14;
rbInsert(&root, n14);
p_rbtree_node n15 = getNode(n15);
n15->key = 15;
rbInsert(&root, n15);
return successed;
}
void rbDisplay(p_rbtree_node *root)
{
if (*root == nil)
return;
rbDisplay(&((*root)->left));
if ((*root)->color == RED)
printf("key=%d, color=RED\n", (*root)->key);
else
printf("key=%d, color=BLACK\n", (*root)->key);
rbDisplay(&((*root)->right));
}
void rbMidDisplay(p_rbtree_node *root)
{
if (*root == nil)
return;
if ((*root)->color == RED)
printf("key=%d, color=RED\n", (*root)->key);
else
printf("key=%d, color=BLACK\n", (*root)->key);
rbMidDisplay(&((*root)->left));
rbMidDisplay(&((*root)->right));
}
void Display(void)
{
rbDisplay(&root);
rbMidDisplay(&root);
}
*
* =====================================================================================
*
* Filename: test.c
*
* Description:
*
* Version: 1.0
* Created: 2014年05月05日 11时34分19秒
* Revision: none
* Compiler: gcc
*
* Author: 我叫程序猿XXX
* Company:
*
* =====================================================================================
*/
#include "rbtree.h"
#include <stdio.h>
int main(void)
{
rbBuilt();
Display();
return 0;
}代码是通过先序和中序遍历得出的结果。
我的编译系统是Linux,编译环境是gcc 版本 4.8.2 20131212 (Red Hat 4.8.2-7) (GCC) 。后面将删除代码添加上。如果代码中有任何不对的地方,请大家指出,我好及时修改,谢谢大家。
原文:http://blog.csdn.net/qianligaoshan/article/details/25090527