Red-Black Tree -------------- Macros ~~~~~~ `RB_RED`:: `RB_BLACK`:: Used to mark the color of a `rbnode`. `RBTREE_INIT`:: Initialize a `rbtree` structure. + should only be used with the declaration like: + ---- rbtree tree = RBTREE_INIT(...); ---- + the arguments are pointers to callback functions, in order: `delete_fn`, `update_fn`, `cmp_fn` Data structures ~~~~~~~~~~~~~~~ * `rbnode` + -- The binary tree node. `key`:: The key of this node `data`:: pointer to the data associated with the key `child`:: pointers to the left and right child to this node `color`:: the color, should be a value of `RB_BLACK` or `RB_RED` -- ++++ ++++ * `rbtree` + -- Structure that holds a tree of nodes `root`:: Pointer to the node that is the root of the tree. `delete_fn`:: Pointer to the function that should handle the delete routines for the `rbnode->data` pointer. `update_fn`:: Pointer to the function that is called when the implementation performs an update of an `rbnode->data` pointer. + The function gets the following information passed in order: old pointer, new pointer. NOTE: You may only need this if you store the data in another structure and has to keep it synchronized with the RB-tree. `cmp_fn`:: Pointer to the function that is used to compare `rbnode->data` pointers. + Shall return a value greater than zero if 'ptr1' > 'ptr2', a value less than zero if 'ptr1' < 'ptr2' and zero if 'ptr1' == 'ptr2'. -- Functions ~~~~~~~~~ `rbtree_insert()`:: Creates and inserts a new node in the tree. + If provided, calls `rbtree->update_fn` and `rbtree->delete_fn` if a node should be updated. + Returns a nonzero value if a new node was inserted, zero if 'key' already existed and that node was updated. NOTE: The memory pointed to by the 'data' pointer is *not* copied so you must ensure that it has a infinite lifetime. `rbtree_delete()`:: Deletes a node from the tree. if provided, calls `rbtree->delete_fn` for the node. + Returns non zero if a node was removed. zero otherwise. `rbtree_free()`:: Deletes the whole tree. if provided, calls `rbtree->delete_fn` for every node. `rbtree_walk()`:: Walks the tree in in-order and calls the 'action' callback function for every node. `rbtree_search()`:: Searches the tree for 'key'. + Returns a pointer to the node if found else `NULL`. `rbtree_cmp_search()`:: Searches the tree by compareing 'cmpdata' and `rbnode->data` to find a match. + Returns the node if found, `NULL` otherwise. `rbtree_is_empty()`:: Checks if a tree is empty, retruns zero if the tree is empty, nonzero otherwise.