红黑树的代码实现

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

{

相关文档
最新文档