B树---删除节点

本文介绍了B树中删除节点的策略。当删除的key是叶子节点时直接删除,若非叶子节点,则根据左右子节点数量进行上浮或合并操作。当左右子节点数量相等时,需要进行节点合并,并递归进行删除操作。提供了相应的代码示例进行解释。
摘要由CSDN通过智能技术生成


数据结构

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 就向左边借位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值