设为首页 加入收藏

TOP

相对完整的红黑树(经过比较强的测试)(一)
2014-11-24 00:04:17 来源: 作者: 【 】 浏览:45
Tags:相对 完整 经过 比较 强的 测试

注意main函数中的数据顺序。

#include

#include

typedef enum _color

{

RED,

BLACK

}color;

typedef struct _data

{

int value;

}data;

typedef struct _redblack

{

color m_color;

data *m_data;

struct _redblack *parent;

struct _redblack *left;

struct _redblack *right;

}redblack;

typedef struct _wrapdata

{

redblack *root;

int size;

}wrapdata;

int compare ( redblack *left ,redblack *right)

{

if(left->m_data->value > right->m_data->value)

{

return 1;

}

else

{

return 0;

}

}

redblack * newstruct ( data *newdata)

{

redblack *newnode;

newnode=(redblack *)calloc (1 ,sizeof (redblack));

newnode->m_color=RED;

newnode->m_data=newdata;

return newnode;

}

void rotate_right ( redblack * left ,redblack *right )

{

right->left=left->right;

if(left->right)

{

left->right->parent=right;

}

left->right=right;

left->parent=right->parent;

if(right->parent)

{

if(right->parent->left==right)

{

right->parent->left=left;

}

else

{

right->parent->right=left;

}

}

right->parent=left;

}

void rotate_left ( redblack * left ,redblack *right )

{

left->right=right->left;

if (right->left)

{

right->left->parent=left;

}

right->left=left;

right->parent=left->parent;

if(left->parent)

{

if(left->parent->right==left)

{

left->parent->right=right;

}

else

{

left->parent->left=right;

}

}

left->parent=right;

}

void mid_print (redblack *root)

{

if (!root)

{

return;

}

else

{

mid_print (root ->left);

printf("%d ",root->m_data->value);

mid_print (root ->right);

}

}

void left_print (redblack *root)

{

if (!root)

{

return;

}

else

{

printf("%d ",root->m_data->value);

left_print (root ->left);

left_print (root ->right);

}

}

void right_print (redblack *root)

{

if (!root)

{

return;

}

else

{

right_print (root ->left);

right_print (root ->right);

printf("%d ",root->m_data->value);

}

}

int depth(redblack *root)

{

int left,right;

if (!root)

{

return 0;

}

else

{

left=depth(root->left);

right=depth(root->right);

return left>right ( left+1):(right+1);

}

}

void insert_fixup (wrapdata *node , redblack *newnode)

{

redblack *curnode;

redblack *parent;

redblack *grandparent;

redblack *tmp;

curnode=newnode;

parent=curnode->parent;

while( curnode->m_color==RED && parent ->m_color==RED)

{

grandparent=parent->parent;

if ( curnode == parent->left)

{

if ( parent == grandparent->left)

{

curnode->m_color=BLACK;

rotate_right ( parent , grandparent);

curnode=parent;

parent=curnode->parent;

if(!parent )

{

node->root=curnode;

break;

}

}

else

{

// printf("nothing");

rotate_right (curnode, parent );

tmp=parent;

parent=curnode;

curnode=tmp;

curnode->m_color=BLACK;

rotate_left (grandparent ,parent );

curnode=parent;

parent=cu

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇删除功能更加完备的红黑树 下一篇如何编写windows服务程序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: