Skip to content

Red black tree

include/structures/rbt.h View source View on GitHub
struct rbt_parent (1 field) source
§ uintptr_t word

Lowest bit is color

struct rbt_node (3 fields) source
§ struct rbt_node *left
§ struct rbt_node *right
§ struct rbt_parent parent_data
struct rbt (3 fields) source
TODO

stop using get_data. for now it works but in the future we may want to allow for rb-trees that are “backwards” or sorted by some other rule beyond integer field comparison

§ rbt_get_data get_data
§ rbt_compare compare
§ struct rbt_node *root
enum rbt_node_color (2 variants) source
§ TREE_NODE_RED = 0
§ TREE_NODE_BLACK = 1
typedef int32_t (*rbt_compare)(
    const struct rbt_node * a,
    const struct rbt_node * b
)
source
typedef size_t (*rbt_get_data)(struct rbt_node * *)
source
struct rbt_node * rbt_parent(const struct rbt_node *node)
source
enum rbt_node_color rbt_color(const struct rbt_node *node)
source
void rbt_set_color(struct rbt_node *node, enum rbt_node_color c)
source
void rbt_set_parent(struct rbt_node *node, struct rbt_node *parent)
source
struct rbt_node * rbt_last(const struct rbt *root)
source
struct rbt_node * rbt_prev(struct rbt_node *node)
source
void rbt_init_node(struct rbt_node *n)
source
struct rbt_node * rbt_first(const struct rbt *root)
source
void rbt_link_node(
    struct rbt_node *node,
    struct rbt_node *parent,
    struct rbt_node **link
)
source
void rbt_insert_color(struct rbt *tree, struct rbt_node *node)
source
struct rbt * rbt_init(
    struct rbt *t,
    rbt_get_data get_data,
    rbt_compare compare
)
source
struct rbt * rbt_create(rbt_get_data get, rbt_compare compare)
source
struct rbt_node * rbt_find_min(struct rbt_node *node)
source
struct rbt_node * rbt_find_max(struct rbt_node *node)
source
void rbt_delete(struct rbt *tree, struct rbt_node *z)
source

z must be linked into tree

struct rbt_node * rbt_search(struct rbt *tree, uint64_t data)
source
void rbt_remove(struct rbt *tree, uint64_t data)
source
void rbt_insert(struct rbt *tree, struct rbt_node *new_node)
source
struct rbt_node * rbt_min(struct rbt *tree)
source
struct rbt_node * rbt_max(struct rbt *tree)
source
struct rbt_node * rbt_next(struct rbt_node *node)
source
struct rbt_node * rbt_find_predecessor(
    struct rbt *tree,
    uint64_t data
)
source
struct rbt_node * rbt_find_successor(struct rbt *tree, uint64_t data)
source
bool rbt_empty(struct rbt *tree)
source
bool rbt_has_node(struct rbt *tree, struct rbt_node *node)
source
bool rbt_reinsert(struct rbt *tree, struct rbt_node *node)
source

Re-position nodes whose sort key changes, with checks to first verify it needs to move at all, returning true if moved

bool rbt_position_valid(struct rbt *tree, struct rbt_node *node)
source

True when ordering is correct

void rbt_move(struct rbt *from, struct rbt *to, struct rbt_node *node)
source
#define RBT_NODE_INIT
source
Expansion
#define RBT_NODE_INIT \
    (struct rbt_node) { \
        .parent_data.word = TREE_NODE_BLACK, .left = NULL, .right = NULL \
    }
#define rbt_for_each_safe(pos, tmp, root)
source
Expansion
#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, tree, member)
source
Expansion
#define rbt_for_each_entry_safe(pos, tmp, tree, member) \
    for (typeof(rbt_first(tree)) __n = rbt_first(tree), __nx = NULL; \
         __n != NULL && \
         (((pos) = rbt_entry(__n, typeof(*(pos)), member)), \
          (__nx = rbt_next(__n)), \
          ((tmp) = __nx ? rbt_entry(__nx, typeof(*(tmp)), member) : NULL), \
          true); \
         __n = __nx)
#define rbt_for_each_safe_reverse(pos, tmp, root)
source
Expansion
#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, tree, member)
source
Expansion
#define rbt_for_each_entry_safe_reverse(pos, tmp, tree, member) \
    for (typeof(rbt_last(tree)) __n = rbt_last(tree), __nx = NULL; \
         __n != NULL && \
         (((pos) = rbt_entry(__n, typeof(*(pos)), member)), \
          (__nx = rbt_prev(__n)), \
          ((tmp) = __nx ? rbt_entry(__nx, typeof(*(tmp)), member) : NULL), \
          true); \
         __n = __nx)
#define rbt_for_each(pos, root)
source
Expansion
#define rbt_for_each(pos, root) \
    for (pos = rbt_first(root); pos != NULL; pos = rbt_next(pos))
#define rbt_for_each_entry(pos, tree, member)
source
Expansion
#define rbt_for_each_entry(pos, tree, member) \
    for (typeof(rbt_first(tree)) __n = rbt_first(tree); \
         __n != NULL && \
         (((pos) = rbt_entry(__n, typeof(*(pos)), member)), true); \
         __n = rbt_next(__n))
#define rbt_for_each_reverse(pos, root)
source
Expansion
#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, tree, member)
source
Expansion
#define rbt_for_each_entry_reverse(pos, tree, member) \
    for (typeof(rbt_last(tree)) __n = rbt_last(tree); \
         __n != NULL && \
         (((pos) = rbt_entry(__n, typeof(*(pos)), member)), true); \
         __n = rbt_prev(__n))
#define rbt_entry(ptr, type, member)
source
Expansion
#define rbt_entry(ptr, type, member) container_of(ptr, type, member)