btree_node* btree_insert(btree_node *root, int target) { if(NULL == root) { return NULL; } if(2 * M - 1 == root->num) { btree_node *node = btree_node_new(); if(NULL == node) { return root; } node->is_leaf = 0; node->p[0] = root; btree_split_child(node, 0, root); btree_insert_nonfull(node, target); return node; } else { btree_insert_nonfull(root, target); return root; } }
btree_node *BPlusTree::btree_create() { btree_node *node = btree_node_new(); if(NULL == node) { return NULL; } node->next = node; node->prev = node; return node; }
int btree_split_child(btree_node *parent, int pos, btree_node *child) { btree_node *new_child = btree_node_new(); if(NULL == new_child) { return -1; } new_child->is_leaf = child->is_leaf; new_child->num = M - 1; for(int i = 0; i < M - 1; i++) { new_child->k[i] = child->k[i+M]; } if(false == new_child->is_leaf) { for(int i = 0; i < M; i++) { new_child->p[i] = child->p[i+M]; } } child->num = M - 1; if(true == child->is_leaf) { child->num++; // if leaf, keep the middle ele, put it in the left } for(int i = parent->num; i > pos; i--) { parent->p[i+1] = parent->p[i]; } parent->p[pos+1] = new_child; for(int i = parent->num - 1; i >= pos; i--) { parent->k[i+1] = parent->k[i]; } parent->k[pos] = child->k[M-1]; parent->num += 1; // update link if(true == child->is_leaf) { new_child->next = child->next; child->next->prev = new_child; new_child->prev = child; child->next = new_child; } }