예제 #1
0
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);
  }
}
예제 #2
0
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);
    }
}
예제 #3
0
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;
}