数据结构
typedef int KEY_VALUE;
typedef struct _btree_node
{
KEY_VALUE *keys;// 关键字数组
struct _btree_node **childrens; //指针数组 叶子节点
int num;//关键字数量
int leaf;// 是否为叶子节点
}btree_node;
typedef struct _btree
{
btree_node *root;
int t;
} btree;
一、删除节点
-
被删除key是当前点node的上的key
- 如果是叶子节点直接删除
- 如果不是叶子节点
- 如果当前node 左子节点 num 大于T->t,则左子节点最右key上浮,然后删除左子节点最右key 递归进入(一)
- 如果当前node右子节点 num 大于T->t,则右子节点最左key上浮,然后删除右子节点最左key 递归进入(一)
- 如果node 左右子节点 num 等于T->t,则合并进入(二),然后删除合并后 key的位置,递归进入(一)
-
被删除key在node的子树child上时
- node子树为child
- child num为最小满足(num==T->t-1)时
- child左边相邻的为left ,右边相邻的为right
- left->num大于T->t 或者 left->num大于T->t 向其借位
- 不能借位 就合并
- child num>T->t -1时 直接删除子节点 递归进入(一)
代码如下(示例):
void btree_delete_key(btree *T, btree_node *node, KEY_VALUE key){
if(node==NULL) return;
int idx =0 ,i;
while(idx < node->num && key > node->keys[idx]) idx++;//找到第一个比key小的点(等于或者大于)
if(idx < node->num && key == node->keys[idx]){
if(node->leaf){
for(i=idx; i < node->num-1; i++){
//将key往前移一位
node->keys[i] = node->keys[i+1];
}
node->keys[node->num -1] = 0; //最后一位变成0
node->num--;
if(node->num == 0)//root{
free(node);
T->root = NULL;
}
return;
}
else if(node->childrens[idx]->num >= T->t){
//如果当前关键字对应的左子树满足DEGREE 就向左边借位