Linux内核中的红黑树定义为:struct rb_node
- 初始化红黑树
struct rb_root mytree = RB_ROOT;
假设有如下定义
typedef struct rbtree_test_s
{
char str[32];
struct rb_node rbnode;
int a;
}rbtree_test_t;
- 操作红黑树
插入和查找数据,需要自己实现,代码如下:
int my_insert(struct rb_root *root, rbtree_test_t *data)
{
struct rb_node **new = &(root->rb_node), *parent = NULL;
/* Figure out where to put new node */
while (*new)
{
rbtree_test_t *this = container_of(*new, rbtree_test_t, rbnode);
int result = strcmp(data->str, this->str);
parent = *new;
if (result < 0)
new = &((*new)->rb_left);
else if (result > 0)
new = &((*new)->rb_right);
else
return 0;
}
/* Add new node and rebalance tree. */
rb_link_node(&data->rbnode, parent, new);
rb_insert_color(&data->rbnode, root);
return 1;
}
rbtree_test_t *my_search(struct rb_root *root, char *string)
{
struct rb_node *node = root->rb_node;
while (node) {
rbtree_test_t *data = container_of(node, rbtree_test_t, rbnode);
int result;
result = strcmp(string, data->str);
if (result < 0)
node = node->rb_left;
else if (result > 0)
node = node->rb_right;
else
return data;
}
return NULL;
}
删除数据:rb_erase
遍历红黑树的方式:
struct rb_node *node;
for (node = rb_first(&mytree); node; node = rb_next(node))
printf("key=%s\n", rb_entry(node, rbtree_test_t, rbnode)->str);
- 具体用法,详见下边的例子
int main(int argc, char** argv)
{
rbtree_test_t a1={0};
rbtree_test_t a2={0};
rbtree_test_t a3={0};
strcpy(a1.str, "a1");
my_insert(&mytree, &a1);
strcpy(a2.str, "a2");
my_insert(&mytree, &a2);
strcpy(a3.str, "a3");
my_insert(&mytree, &a3);
//遍历红黑树
struct rb_node *node;
for (node = rb_first(&mytree); node; node = rb_next(node))
printf("key=%s\n", rb_entry(node, rbtree_test_t, rbnode)->str);
printf("-----------------------\n");
rbtree_test_t* p = my_search(&mytree, "a2");
if (p)
{
strcpy(p->str, "hyq");
//rb_erase(&p->rbnode, &mytree);
}
for (node = rb_first(&mytree); node; node = rb_next(node))
printf("key=%s\n", rb_entry(node, rbtree_test_t, rbnode)->str);
return 0;
}