rb_node_t * rb_insert(const key_type key, const value_type value, rb_node_t **root) { rb_node_t *parent = NULL, *node = NULL; int32_t ret = 0; if (( node = rb_search_auxiliary(*root,key,&parent))) { return NULL; } node = rb_node_new(key,value); node->color = RED; node->parent = parent; //ret = key - parent->key; if ( parent ) { if ( ret > 0 ) { parent->right = node; }else if ( ret < 0 ) { parent ->left = node; } }else { //空树 *root = node; } return rb_insert_rebalance(node,root); }
rb_node_t *rb_insert(key_t key, data_t data, rb_node_t *root) { rb_node_t *parent = NULL; rb_node_t *node = NULL; parent = NULL; if ((node = rb_search_auxiliary(key, root, &parent))) { return root; } node = rb_new_node(key, data); node->parent = parent; node->left = node->right = NULL; node->color = RED; if(parent) { if (parent->key > key) { parent->left = node; }else { parent->right = node; } }else { root = node; } return rb_insert_rebalance(node, root); }
rb_node_t * rb_add_node( rb_node_t* adnode, rb_node_t **root) { rb_node_t *parent = NULL, *node = NULL; int32_t ret = 0; if (( node = rb_search_auxiliary(*root,adnode->key,&parent))) { //found,cannot insert repeatly,so return return NULL; } adnode->color = RED; adnode->parent = parent; //ret = adnode->key - parent->key; if ( parent ) { if ( ret > 0 ) { parent->right = adnode; }else if ( ret < 0 ) { parent ->left = adnode; } }else { //空树 *root = adnode; } return rb_insert_rebalance(adnode,root); }
//四、红黑树的插入 //--------------------------------------------------------- //红黑树的插入结点 rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root) { rb_node_t *parent = NULL, *node; parent = NULL; //调用rb_search_auxiliary找到插入结点的地方 if((node = rb_search_auxiliary(key, root, &parent))){ return root; } node = rb_new_node(key, data);//分配结点 node->parent = parent; node->left = node->right = NULL; node->color = RED; if(parent){ if (parent->key > key){ parent->left = node; }else{ parent->right = node; } }else{ root = node; } return rb_insert_rebalance(node, root); //插入结点后,调用rb_insert_rebalance修复红黑树的性质 }
static RBTreeNode* rb_insert( RBTree *rbt, int key, const void *keydata, void *data ) { RBTreeNode *root, *node, *parent_node; parent_node = NULL; root = rbt->root; node = rb_search_auxiliary( root, key, keydata, rbt->compare, &parent_node ); if( node ) { return NULL; } node = (RBTreeNode*)malloc( sizeof(RBTreeNode) ); node->left = NULL; node->parent = parent_node; node->right = NULL; node->data = data; node->key = key; node->color = RED; if( parent_node ) { if( rbt->compare && keydata ) { if( rbt->compare( parent_node->data, keydata ) > 0 ) { parent_node->left = node; } else { parent_node->right = node; } } else { if( parent_node->key > key ) { parent_node->left = node; } else { parent_node->right = node; } } } else { root = node; } rbt->total_node += 1; /* 调整红黑树的平衡 */ rbt->root = rb_insert_rebalance( root, node ); return node; }
static int rb_insert( rb_tree_t *rbt, mem_data_t *data, rb_data_type_t type ) { rb_node_t *root, *node, *parent_node; parent_node = NULL; root = rbt->root; node = rb_search_auxiliary( root, data, type, &parent_node ); if( node ) { return -1; } node = (rb_node_t*)malloc( sizeof(rb_node_t) ); node->left = NULL; node->parent = parent_node; node->right = NULL; node->mem_data = *data; node->color = RED; if( parent_node ) { if( type == RB_DATA_TYPE_ADDR ) { if( parent_node->mem_data.mem_blk.mem_addr > data->mem_blk.mem_addr ) { parent_node->left = node; } else { parent_node->right = node; } } else { if( parent_node->mem_data.mem_info.class_id > data->mem_info.class_id ) { parent_node->left = node; } else { parent_node->right = node; } } } else { root = node; } /* 调整红黑树的平衡 */ rbt->root = rb_insert_rebalance( root, node ); return 0; }
int rb_insert(struct rb_node* node, struct rb_root* root, int (*cmp_func)(struct rb_node*, struct rb_node*)) { struct rb_node *parent = NULL, **cursor = &root->node; while (*cursor) { int diff; parent = *cursor; diff = cmp_func(node, parent); if (diff < 0) cursor = &parent->left; else if (diff > 0) cursor = &parent->right; else return -1; } rb_link_node(node, parent, cursor); rb_insert_rebalance(node, root); return 0; }