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; }
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; }
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; }