Skip to content

Red black tree

include/structures/rbt.h View source View on GitHub
struct rbt_node {
    enum rbt_node_color  color;
    struct rbt_node      *left;
    struct rbt_node      *right;
    struct rbt_node      *parent;
};
struct rbt {
    rbt_get_data     get_data;
    rbt_compare      compare;
    struct rbt_node  *root;
};
enum rbt_node_color {
    TREE_NODE_RED,
    TREE_NODE_BLACK,
};
typedef int32_t (*rbt_compare)(const struct rbt_node * a, const struct rbt_node * b);
typedef size_t (*rbt_get_data)(struct rbt_node * *);
struct rbt_node rbt_last(const struct rbt *root);
struct rbt_node rbt_prev(struct rbt_node *node);
void rbt_init_node(struct rbt_node *n);
struct rbt_node rbt_first(const struct rbt *root);
void rbt_link_node(struct rbt_node *node, struct rbt_node *parent, struct rbt_node **link);
void rbt_insert_color(struct rbt *tree, struct rbt_node *node);
struct rbt * rbt_init(struct rbt *t, rbt_get_data get_data, rbt_compare compare);
struct rbt * rbt_create(rbt_get_data get, rbt_compare compare);
struct rbt_node * rbt_find_min(struct rbt_node *node);
struct rbt_node * rbt_find_max(struct rbt_node *node);
void rbt_delete(struct rbt *tree, struct rbt_node *z);
struct rbt_node * rbt_search(struct rbt *tree, uint64_t data);
void rbt_remove(struct rbt *tree, uint64_t data);
void rbt_insert(struct rbt *tree, struct rbt_node *new_node);
struct rbt_node * rbt_min(struct rbt *tree);
struct rbt_node * rbt_max(struct rbt *tree);
struct rbt_node * rbt_next(struct rbt_node *node);
struct rbt_node * rbt_find_predecessor(struct rbt *tree, uint64_t data);
struct rbt_node * rbt_find_successor(struct rbt *tree, uint64_t data);
bool rbt_empty(struct rbt *tree);
bool rbt_has_node(struct rbt *tree, struct rbt_node *node);
#define rbt_for_each_safe(pos, tmp, root) \
    for (pos = rbt_first(root), tmp = rbt_next(pos); pos != NULL; \
         pos = tmp, tmp = rbt_next(pos))
#define rbt_for_each_entry_safe(pos, tmp, type, member, root) \
    for (pos = rbt_entry(rbt_first(root), type, member), \
        tmp = rbt_entry(rbt_next(&pos->member), type, member); \
         &pos->member != NULL; \
         pos = tmp, tmp = rbt_entry(rbt_next(&tmp->member), type, member))
#define rbt_for_each_safe_reverse(pos, tmp, root) \
    for (pos = rbt_last(root), tmp = rbt_prev(pos); pos != NULL; \
         pos = tmp, tmp = rbt_prev(pos))
#define rbt_for_each_entry_safe_reverse(pos, tmp, type, member, root) \
    for (pos = rbt_entry(rbt_last(root), type, member), \
        tmp = rbt_entry(rbt_prev(&pos->member), type, member); \
         &pos->member != NULL; \
         pos = tmp, tmp = rbt_entry(rbt_prev(&tmp->member), type, member))
#define rbt_for_each(pos, root) \
    for (pos = rbt_first(root); pos != NULL; pos = rbt_next(pos))
#define rbt_for_each_entry(pos, type, member, root) \
    for (pos = rbt_entry(rbt_first(root), type, member); &pos->member != NULL; \
         pos = rbt_entry(rbt_next(&pos->member), type, member))
#define rbt_for_each_reverse(pos, root) \
    for (pos = rbt_last(root); pos != NULL; pos = rbt_prev(pos))
#define rbt_for_each_entry_reverse(pos, type, member, root) \
    for (pos = rbt_entry(rbt_last(root), type, member); &pos->member != NULL; \
         pos = rbt_entry(rbt_prev(&pos->member), type, member))
#define rbt_entry(ptr, type, member) container_of(ptr, type, member)
#define rbt_parent(n) ((n)->parent)
#define RBT_NODE_INIT \
    (struct rbt_node) { \
        .color = TREE_NODE_BLACK, .left = NULL, .right = NULL, .parent = NULL \
    }