Example #1
0
void rbtree_insert(rbtree t, void* key, void* value, compare_func compare) {
    node inserted_node = new_node(key, value, RED, NULL, NULL);
    if (t->root == NULL) {
        t->root = inserted_node;
    } else {
        node n = t->root;
        while (1) {
            int comp_result = compare(key, n->key);
            if (comp_result == 0) {
                n->value = value;
                return;
            } else if (comp_result < 0) {
                if (n->left == NULL) {
                    n->left = inserted_node;
                    break;
                } else {
                    n = n->left;
                }
            } else {
                assert (comp_result > 0);
                if (n->right == NULL) {
                    n->right = inserted_node;
                    break;
                } else {
                    n = n->right;
                }
            }
        }
        inserted_node->parent = n;
    }
    insert_case1(t, inserted_node);
}
Example #2
0
static inline void
rbtree_add_node_impl(struct RBTREE_TYPENAME* target,
                     struct RBTREE_NODE* N)
{
  DEBUG_RBTREE("rbtree_add_node_impl: "RBTREE_KEY_PRNF"\n",
               RBTREE_KEY_PRN(N->key));
  DEBUG_RBTREE("before:\n");
  // RBTREE_PRINT(target);
  N->color = RED;
  if (target->size == 0)
  {
    target->root = N;
    target->size = 1;
    insert_case1(target, N);
  }
  else
  {
    // Normal tree insertion
    struct RBTREE_NODE* root = target->root;
    rbtree_add_loop(target, N, root);
    insert_case2(target, N);
  }
  DEBUG_RBTREE("after:\n");
  // RBTREE_PRINT(target);
}
Example #3
0
void rbtree_insert(rbtree t, void* key, void* value, compare_func compare) {
    node inserted_node = new_node(key, value, RED, NULL, NULL);
    if (t->root == NULL) {
        t->root = inserted_node;
    } else {
        node n = t->root;
        while (1) {
            int comp_result = compare(key, n->key);
            if (comp_result == 0) {
                n->value = value;
                /* inserted_node isn't going to be used, don't leak it */
                free (inserted_node);
                return;
            } else if (comp_result < 0) {
                if (n->left == NULL) {
                    n->left = inserted_node;
                    break;
                } else {
                    n = n->left;
                }
            } else {
                assert (comp_result > 0);
                if (n->right == NULL) {
                    n->right = inserted_node;
                    break;
                } else {
                    n = n->right;
                }
            }
        }
        inserted_node->parent = n;
    }
    insert_case1(t, inserted_node);
    verify_properties(t);
}
Example #4
0
rb_node* rb_insert(uint32_t key, rb_tree* tree) {
	rb_node* n = calloc(1,sizeof(rb_node));
	n->key = key;
	n->color = RED;
	n->left = tree->nil;
	n->right = tree->nil;
	
	#ifdef DEBUG
	is_correct(tree);
	#endif
	
	if(tree->root)
		tree_insert(n, tree->root, tree);
	else
		tree->root = n;
	
	#ifdef DEBUG
	is_correct(tree);
	#endif
	
	insert_case1(n, tree);
	
	#ifdef DEBUG
	is_correct(tree);
	#endif
	
	tree->n++;
	return n;
}
Example #5
0
void bbst_insert(bbst tree, void* key, void* value, compare_func compare){
    node inserted_node = new_node(key, value, RED, NULL, NULL);
    if(tree->root == NULL){
        tree->root = inserted_node;
    } else {
        node n = tree->root;
        while(1==1){
            int compare_result = compare(key, n->key);
            if(compare_result == 0){
                free(inserted_node);
                return;
            } else if (compare_result < 0) {
                if(n->left == NULL){
                    n->left = inserted_node;
                    break;
                } else
                    n = n->left;
            } else {
                if(n->right == NULL){
                    n->right = inserted_node;
                    break;
                } else
                    n = n->right;
            }
        }
        inserted_node->parent = n;
    }
    insert_case1(tree, inserted_node);
}
Example #6
0
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  insert_node
 *  Description:  
 * =====================================================================================
 */
void insert_node 
    ( 
    set * root,
    set * node,
    int (*compare)(void *, void *)
    )
{
set * set_ptr = root;
set * set_ptr_parent;

/***************************************
*       Insert the actual data         *
***************************************/
/* If there's no data in the root just add the data there */
if(root->data == NULL)
    {
    root->data = node->data;
    }
else
    {
    /* Remember: only unique values are allowed */
    while(set_ptr != NULL)
        {
        if(compare(node->data, set_ptr->data) == 0)
            {
            /* Return since we're trying to insert an item already in the set */
            return;
            }
        else if(compare(node->data, set_ptr->data) < 0)
            {
            set_ptr_parent = set_ptr;
            set_ptr = set_ptr->left;
            }
        else
            {
            set_ptr_parent = set_ptr;
            set_ptr = set_ptr->right;
            }
        }
    /* Decide if the node should be left or right child */
    if(compare(node->data, set_ptr_parent->data) < 0)
        {
        set_ptr_parent->left = node;
        }
    else
        {
        set_ptr_parent->right = node;
        }
    }
node->color = RED;


/***************************************
*        Insertion bookkeeping         *
***************************************/
insert_case1(node);
}		/* -----  end of function insert_node  ----- */
Example #7
0
static void insert_case3(L_RBTREE *t, node *n) {
    if (node_color(uncle(n)) == L_RED_NODE) {
        n->parent->color = L_BLACK_NODE;
        uncle(n)->color = L_BLACK_NODE;
        grandparent(n)->color = L_RED_NODE;
        insert_case1(t, grandparent(n));
    } else {
        insert_case4(t, n);
    }
}
Example #8
0
void insert_case3(rbtree t, node n) {
    if (node_color(uncle(n)) == RED) {
        n->parent->color = BLACK;
        uncle(n)->color = BLACK;
        grandparent(n)->color = RED;
        insert_case1(t, grandparent(n));
    } else {
        insert_case4(t, n);
    }
}
Example #9
0
void insert_case3(rb_node* n, rb_tree* tree) {
	rb_node* u = uncle(n), *g; 

	if ((u != NULL) && (u->color == RED)) {
		n->parent->color = BLACK;
		u->color = BLACK;
		g = grandparent(n);
		g->color = RED;
		insert_case1(g, tree);
	}
	else {
		insert_case4(n, tree);
	}
}
Example #10
0
/*
 *  l_rbtreeInsert()
 *
 *      Input:  t (rbtree, including root node)
 *              key (insert a node with this key, if the key does not already
 *                   exist in the tree)
 *              value (typically an int, used for an index)
 *      Return: void
 *
 *  Notes:
 *      (1) If a node with the key already exists, this just updates the value.
 */
void
l_rbtreeInsert(L_RBTREE     *t,
               RB_TYPE       key,
               RB_TYPE       value)
{
node  *n, *inserted_node;

    PROCNAME("l_rbtreeInsert");

    if (!t) {
        L_ERROR("tree is null\n", procName);
        return;
    }

    inserted_node = new_node(key, value, L_RED_NODE, NULL, NULL);
    if (t->root == NULL) {
        t->root = inserted_node;
    } else {
        n = t->root;
        while (1) {
            int comp_result = l_compareKeys(t->keytype, key, n->key);
            if (comp_result == 0) {
                n->value = value;
                LEPT_FREE(inserted_node);
                return;
            } else if (comp_result < 0) {
                if (n->left == NULL) {
                    n->left = inserted_node;
                    break;
                } else {
                    n = n->left;
                }
            } else {  /* comp_result > 0 */
                if (n->right == NULL) {
                    n->right = inserted_node;
                    break;
                } else {
                    n = n->right;
                }
            }
        }
        inserted_node->parent = n;
    }
    insert_case1(t, inserted_node);
    verify_properties(t);
}
Example #11
0
static void
insert_case3(struct RBTREE_TYPENAME* target, struct RBTREE_NODE* node)
{
  struct RBTREE_NODE* U = uncle(node);
  struct RBTREE_NODE* G;

  DEBUG_RBTREE("insert_case3\n");
  if (U != NULL && U->color == RED)
  {
    node->parent->color = BLACK;
    U->color = BLACK;
    G = grandparent(node);
    G->color = RED;
    insert_case1(target, G);
  }
  else
  {
    insert_case4(target, node);
  }
}
Example #12
0
/* 
 * ===  FUNCTION  ======================================================================
 *         Name:  insert_case3
 *  Description:  Covers the case that the parent and uncle are both RED
 * =====================================================================================
 */
static void insert_case3 
    ( 
    set * n
    )
{
set * u = uncle(n);
set * g;
if((u != NULL      )
&& (u->color == RED))
    {
    n->parent->color = BLACK;
    u->color = BLACK;
    g = grandparent(n);
    g->color = RED;
    insert_case1(g);
    }
else
    {
    insert_case4(n);
    }
}		/* -----  end of static function insert_case3  ----- */
Example #13
0
File: rbtree.c Project: hgn/ospfd
void rbtree_insert(struct rbtree* t, struct rbtree_node *inserted_node)
{

    inserted_node->color  = RED;
    inserted_node->left   = NULL;
    inserted_node->right  = NULL;
    inserted_node->parent = NULL;

    if (t->root == NULL) {
        t->root = inserted_node;
    } else {
        struct rbtree_node* n = t->root;
        while (1) {
            int comp_result = t->compare(inserted_node->key, n->key);
            if (comp_result == 0) {
				/* duplicate */
                n->data = inserted_node->data;
                return;
            } else if (comp_result < 0) {
                if (n->left == NULL) {
                    n->left = inserted_node;
                    break;
                } else {
                    n = n->left;
                }
            } else {
                assert (comp_result > 0);
                if (n->right == NULL) {
                    n->right = inserted_node;
                    break;
                } else {
                    n = n->right;
                }
            }
        }
        inserted_node->parent = n;
    }
	t->size++;
    insert_case1(t, inserted_node);
}
Example #14
0
void rbtree_insert(GtkWidget *darea, rbtree t, int key) {
  int x = WIDTH / 2, y = 22, r = (WIDTH - 20) / 2;

  char *s = (char*) malloc(3 * sizeof(char));
  sprintf(s, "%d", key);

  node inserted_node = new_node(key, RED, NULL, NULL);

  if (t->root == NULL) {
    inserted_node->x = x;
    inserted_node->y = y;
    inserted_node->r = r;

    t->root = inserted_node;
  }
  else {
    node n = t->root;

    while (1) {
      int comp = compare(key, n->key);

      if (comp == 0) {
        if (path)
          print_circle(darea, s, RED, x - 20, y, 10, 12);

        free (inserted_node);

        return;
      }
      else if (comp < 0) {
        if (path)
          print_circle(darea, s, RED, x - 20, y, 10, 12);

        if (n->left == NULL) {
          inserted_node->x = x - r / 2;
          inserted_node->y = y + 30;
          inserted_node->r = r / 2;

          n->left = inserted_node;

          print_circle(darea, s, RED, inserted_node->x, inserted_node->y, 15, 16);

          break;
        }
        else {
          x -= r / 2;
          y += 30;
          r /= 2;

          n = n->left;
        }
      }
      else {
        if (path)
          print_circle(darea, s, RED, x - 20, y, 10, 12);

        if (n->right == NULL) {
          inserted_node->x = x + r / 2;
          inserted_node->y = y + 30;
          inserted_node->r = r / 2;

          n->right = inserted_node;

          print_circle(darea, s, RED, inserted_node->x, inserted_node->y, 15, 16);

          break;
        }
        else {
          x += r / 2;
          y += 30;
          r /= 2;

          n = n->right;
        }
      }
    }

    inserted_node->parent = n;
  }

  insert_case1(darea, t, inserted_node);
}