1.红黑树
五大特性:
1.节点是红色或黑色
2.根节点是黑色
3.所有叶子节点是黑色
4.每个红色节点的两个子节点都是黑色
5.从任意一个节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点
2.API接口
结构体
struct test_rbtree_s {
test_rbtree_node_t *root;
test_rbtree_node_t *sentinel;
test_rbtree_insert_pt insert;
};
struct test_rbtree_node_s {
test_rbtree_key_t key;
test_rbtree_node_t *left;
test_rbtree_node_t *right;
test_rbtree_node_t *parent;
u_char color;
u_char data;
};
2.1 test_rbtree_init
#define test_rbtree_init(tree, s, i) \
test_rbtree_sentinel_init(s); \
(tree)->root = s; \
(tree)->sentinel = s; \
(tree)->insert = i
#define test_rbtree_sentinel_init(node) test_rbt_black(node)
2.2 test_rbtree_insert
void test_rbtree_insert(test_rbtree_t *tree, test_rbtree_node_t *node);
2.3 test_rbtree_delete
void test_rbtree_delete(test_rbtree_t *tree, test_rbtree_node_t *node);
2.4 回调函数
typedef void (*test_rbtree_insert_pt) (test_rbtree_node_t *root,test_rbtree_node_t *node, test_rbtree_node_t *sentinel);
2.5 辅助函数
#define test_rbt_red(node) ((node)->color = 1)
#define test_rbt_black(node) ((node)->color = 0)
#define test_rbt_is_red(node) ((node)->color)
#define test_rbt_is_black(node) (!test_rbt_is_red(node))
#define test_rbt_copy_color(n1, n2) (n1->color = n2->color)
static test_inline test_rbtree_node_t *
test_rbtree_min(test_rbtree_node_t *node, test_rbtree_node_t *sentinel)
{
while (node->left != sentinel) {
node = node->left;
}
return node;
}
3.应用例子
test_rbtree_t rbtree;
test_rbtree_node_t sentinel;
test_rbtree_init(&rbtree, &sentinel, test_rbtree_insert_value);
// rbTreeNode自定义结构体,第一个成员要为test_rbtree_node_t类型
test_rbtree_insert(&rbtree, &rbTreeNode[i].node);
// 查找最小值
test_rbtree_min(rbtree.root , &sentinel);
test_rbtree_delete(&rbtree, &lookupNode->node);