void rb_insert_case3(struct rb_tree_node *n) { struct rb_tree_node *p = n->parent; struct rb_tree_node *g = p->parent; struct rb_tree_node *u = g->left == p ? g->right : g->left; if (u && u->color == RED) { p->color = BLACK; u->color = BLACK; g->color = RED; rb_insert_case1(g); } else { rb_insert_case4(n); } }
static void rb_insert_case3(wmem_tree_t *tree, wmem_tree_node_t *node) { wmem_tree_node_t *parent, *grandparent, *uncle; uncle = node_uncle(node); if (uncle && uncle->color == WMEM_NODE_COLOR_RED) { parent = node->parent; grandparent = parent->parent; parent->color = WMEM_NODE_COLOR_BLACK; uncle->color = WMEM_NODE_COLOR_BLACK; grandparent->color = WMEM_NODE_COLOR_RED; rb_insert_case1(tree, grandparent); } else { rb_insert_case4(tree, node); } }
struct rb_tree_node *rb_insert(struct rb_tree *t, void *key) { struct rb_tree_node *n = t->root; if (n) { int cmp; struct rb_tree_node *c; while (n->key) { cmp = t->compare(n->key, key); if (cmp > 0) { c = n->left; if (!c) { c = calloc(1, sizeof(*c)); if (!c) return NULL; c->parent = n; n->left = c; } n = c; } else if (cmp < 0) { c = n->right; if (!c) { c = calloc(1, sizeof(*c)); if (!c) return NULL; c->parent = n; n->right = c; } n = c; } else { return n; } } } else { n = calloc(1, sizeof(*n)); t->root = n; } n->key = key; rb_insert_case1(n); rb_correct_root(t); return n; }