Пример #1
0
struct rbnode * rbt_insert_node(struct rbnode *r,int key,void *val,int szval)
{
	if(r==NULL)
	{
		struct rbnode *item;
		item=malloc(sizeof(struct rbnode));
		if(!item)
			return NULL;
		rbt_node_init(item);
		rbt_node_fill(item,key,val,szval);
		return item;		
	}
	if(key < r->key)
	{
		r->lchild=rbt_insert_node(r->lchild,key,val,szval);
	}
	else if (key > r->key)
	{
		r->rchild=rbt_insert_node(r->rchild,key,val,szval);
	}
	else
	{
		r->dsz=szval;
	}
	
	if(rbt_isred(r->rchild) && !rbt_isred(r->lchild))
	{
		r=rbt_rotate_left(r);
	}
	if(rbt_isred(r->lchild) && rbt_isred(r->lchild->lchild))
	{	
		r=rbt_rotate_right(r);
	}
	if(rbt_isred(r->lchild) && rbt_isred(r->rchild))
	{
		rbt_flipcolor(r);
	}

	return r;
}
Пример #2
0
static void rbt_insert_node(rbt_t* tree, rbt_node_t* node, rbt_node_t* parent){
    if(NULL == parent){ /* inserting root of the tree */
        tree->root = node;
        rbt_ins_recolor(tree, node);
    }else{
        int c = tree->comp(node->contents, parent->contents);
        rbt_node_t** relevant_child = (c<0 ? &(parent->left) : &(parent->right));
        if(*relevant_child){
            rbt_insert_node(tree, node, *relevant_child);
        }else{
            node->parent = parent;
            *relevant_child = node;
            rbt_ins_recolor(tree, node);
        }
    }
}
int main()
{
  // 测试方法:
  // 插入10个元素,遍历该元素,打印
  int i;
  prbtree root;
  nil =(prbtree)malloc(sizeof(rbtree));
  nil->color = BLACK;
  root = nil;
  int array[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  int length = sizeof(array)/sizeof(int);
  /* srand(GetTickCount()); */
  randomize_in_place(array, length);  
  print_array(array, length);  
  fflush(stdout);
  for (i = 0; i < length; i++)
    {
      prbtree y = (prbtree)malloc(sizeof(rbt_node));
      construct_node(y, array[i]);
      // print_node(y);
      root = rbt_insert_node(root, y);
      printf ("the %dth iteration\n",i + 1);
      mid_traverse_node(root);
      /* print_node(root); */
      /* printf("%x\n", (unsigned int)root); */
    }
  // mid_traverse_node(root);
  // 测试删除操作
  randomize_in_place(array, length);
  print_array(array, length);
  fflush(stdout);
  for (i = 0; i < length; ++i)
  {
       prbt_node x = rbt_search(root, array[i]);
       root = rbt_delete_node(root, x);
       printf ("the number %d deleted\n",array[i]);
       printf ("the %dth iteration\n",i + 1);
       mid_traverse_node(root);
  }
  return 0;
}
Пример #4
0
rbt_node_t* rbt_insert(rbt_t* tree, void* value){
    rbt_node_t* new_node = rbt_node_new(value);
    rbt_insert_node(tree, new_node, tree->root);
    return new_node;
}