int BTreeMaximum( BNode *x )
{
if ( x->leaf )
{
return x->key[x->size - 1];
}
else
{
return BTreeMaximum( x->child[x->size] );
}
} int BTreeMinimum( BNode *x )
{
if ( x->leaf )
{
return x->key[0];
}
else
{
return BTreeMinimum( x->child[0] );
}
} void BTreeDelete( BNode *&x, int k )
{
int i = 0;
while ( i < x->size && k > x->key[i] )
{
i++;
}
// case 1
if ( i < x->size && k == x->key[i] && x->leaf )
{
for ( int j = i; j < x->size - 1; ++j )
{
x->key[j] = x->key[j + 1];
}
x->size--;
}
// case 2
else if ( i < x->size && k == x->key[i] && !x->leaf )
{
BNode *y = x->child[i];
BNode *z = x->child[i + 1];
// 2a
if ( y->size >= t )
{
int k_ = BTreeMaximum( y );
x->key[i] = k_;
BTreeDelete( y, k_ );
}
// 2b
else if ( z->size >= t )
{
int k_ = BTreeMinimum( z );
x->key[i] = k_;
BTreeDelete( z, k_ );
}
// 2c
else
{
// update the node y
y->key[t - 1] = k;
for ( int j = t; j < 2 * t - 1; ++j )
{
y->key[j] = z->key[j - t];
y->child[j] = z->child[j - t];
}
y->child[2 * t - 1] = z->child[t - 1];
y->size = y->size + z->size + 1; // update the node x
for ( int j = i; j < x->size - 1; ++j )
{
x->key[j] = x->key[j + 1];
x->child[j + 1] = x->child[j + 2];
}
x->size--; // delete z
delete z;
BTreeDelete( y, k );
} // end else 2c
} // end if case 2
// case 3
else if ( i <= x->size )
{
if ( x->child[i]->size == t - 1 )
{
if ( i > 0 && x->child[i - 1]->size >= t )
{
// update x->child[i]
for ( int j = t - 2; j >= 0; --j )
{
x->child[i]->key[j + 1] = x->child[i]->key[j];
if ( !x->child[i]->leaf )
{
x->child[i]->child[j + 2] = x->child[i]->child[j + 1];
}
}
x->child[i]->child[1] = x->child[i]->child[0];
x->child[i]->key[0] = x->key[i - 1];
x->child[i]->child[0] = x->child[i - 1]->child[x->child[i - 1]->size];
x->child[i]->size++;
// update x
x->key[i - 1] = x->child[i - 1]->key[x->child[i - 1]->size - 1];
// update x->child[i - 1]
x->child[i - 1]->size--;
BTreeDelete( x->child[i], k );
}
else if ( i < x->size && x->child[i + 1]->size >= t )
{
// update x->child[i]
x->child[i]->key[t - 1] = x->key[i];
x->child[i]->child[t] = x->child[i - 1]->child[0];
x->child[i]->size++;
//update x
x->key[i] = x->child[i - 1]->key[0];
//update x->child[i - 1]
for ( int j = 0; j < x->child[i - 1]->size - 1; ++j )
{
x->child[i - 1]->key[j] = x->child[i - 1]->key[j + 1];
x->child[i - 1]->child[j] = x->child[i - 1]->child[j + 1];
}
x->child[i - 1]->child[x->child[i - 1]->size - 1] = x->child[i - 1]->child[x->child[i - 1]->size];
x->child[i - 1]->size--;
BTreeDelete( x->child[i], k );
}
// case 3b
// merge with the left node x->child[i - 1]
else if ( i > 0 )
{
// update x->child[i - 1]
x->child[i - 1]->key[t - 1] = x->key[i - 1];
for ( int j = t; j < 2 * t - 1; ++j )
{
x->child[i - 1]->key[j] = x->child[i]->key[j - t];
x->child[i - 1]->child[j] = x->child[i]->child[j - t];
}
x->child[i - 1]->child[2 * t - 1] = x->child[i]->child[t - 1];
x->child[i - 1]->size = 2 * t - 1;
// delete x->child[i]
delete x->child[i];
// update x
for ( int j = i; j < x->size; ++j )
{
x->key[i - 1] = x->key[i];
x->child[i] = x->child[i + 1];
}
x->size--;
if ( x->size == 0 )
{
x = x->child[0];
BTreeDelete( x, k );
}
else
{
BTreeDelete( x->child[i - 1], k );
}
}
// merge with the right node x->child[i + 1]
else if ( i < x->size )
{
// update x->child[i]
x->child[i]->key[t - 1] = x->key[i];
for ( int j = t; j < 2 * t - 1; ++j )
{
x->child[i]->key[j] = x->child[i + 1]->key[j - t];
x->child[i]->child[j] = x->child[i + 1]->child[j - t];
}
x->child[i]->child[2 * t - 1] = x->child[i + 1]->child[t - 1];
x->child[i]->size = 2 * t - 1;
// delete x->child[i + 1]
delete x->child[i + 1];
// update x
for ( int j = i; j < x->size - 1; ++j )
{
x->key[j] = x->key[j + 1];
x->child[j + 1] = x->child[j + 2];
}
x->size--;
if ( x->size == 0 )
{
x = x->child[0];
BTreeDelete( x, k );
}
else
{
BTreeDelete( x->child[i - 1], k );
}
}
} // end if case 3
else
{
BTreeDelete( x->child[i], k );
}
//
} }

B树的实现与源代码二(删除源代码)的更多相关文章

  1. Android源代码因删除所有git仓库导致的编译错误

    /******************************************************************************** * Android源代码因删除所有g ...

  2. 数据结构系列之2-3树的插入、查找、删除和遍历完整版代码实现(dart语言实现)

    弄懂了二叉树以后,再来看2-3树.网上.书上看了一堆文章和讲解,大部分是概念,很少有代码实现,尤其是删除操作的代码实现.当然,因为2-3树的特性,插入和删除都是比较复杂的,因此经过思考,独创了删除时分 ...

  3. OpenLayers 项目完整分析——(二)源代码总体结构分析

    转自:http://www.cnblogs.com/lzlynn/archive/2008/07/29/1255848.html 二)源代码总体结构分析 通过前面的项目介绍,我们大概已经知道Openl ...

  4. Memcached源代码分析 - Memcached源代码分析之消息回应(3)

    文章列表: <Memcached源代码分析 - Memcached源代码分析之基于Libevent的网络模型(1)> <Memcached源代码分析 - Memcached源代码分析 ...

  5. 数据结构系列之2-3-4树的插入、查找、删除和遍历完整版源代码实现与分析(dart语言实现)

    本文属于原创,转载请注明来源. 在上一篇博文中,详细介绍了2-3树的操作(具体地址:https://www.cnblogs.com/outerspace/p/10861488.html),那么对于更多 ...

  6. B树的查找、插入、删除(附源代码)

    B-Tree Index B-Tree搜索 B-Tree插入 分裂节点 插入节点 B-Tree删除 合并节点 删除节点 Basic B-Tree有两个比较重要的性质: 所有的leaf均在同一个leve ...

  7. 项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】

    在第一篇文章 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]发布后,根据大家的回复,我需要向大家说明几个问题: 1.为什么要用VisualSVN Server,而不用Subver ...

  8. AVL树(查找、插入、删除)——C语言

    AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...

  9. AVL树C++实现(插入,删除,查找,清空,遍历操作)

    AVL.h文件代码 #pragma once #include<iostream> #include<stack> #include <assert.h> usin ...

随机推荐

  1. LibSVM笔记系列(3)——初学移植libsvm的C/C++版本

    在LibSVM笔记系列(1)中已经提到在g++环境中编译LibSVM只需要一个make命令那样简单. 本文将介绍 (1)LibSVM的编译文件结构 (2)svm.h中重要数据结构及函数分析 (3)sv ...

  2. 【LigerUI】ajax请求firefox返回NS_BINDING_ABORTED

    在ligergrid中请求链接,post提交,返回NS_BINDING_ABORTED. 是因为ligergrid中默认是异步提交方式,如果没有设置同步的话, 在请求该链接的时候第一次请求还没有执行完 ...

  3. linux中/etc与/var目录,各是什么意思?这两个目录下的文件有什么特点?

    http://zhidao.baidu.com/link?url=DkxU9CyhJb_dIUAPCmPmxRtQsENgCzqy5qnLPEj_V9DqNzdt6Qya0U5iCVRCYFkgoRo ...

  4. for(;;)和 while(1) 有什么区别吗?for()和while()的使用情景。

    1 for(;;)和 while(1) 有什么区别吗? void main(void) { ; // for(;;) ) { a++; } } arm-linux-gcc -c -o for.o fo ...

  5. BZOJ 1096: [ZJOI2007]仓库建设( dp + 斜率优化 )

    dp(v) = min(dp(p)+cost(p,v))+C(v) 设sum(v) = ∑pi(1≤i≤v), cnt(v) = ∑pi*xi(1≤i≤v), 则cost(p,v) = x(v)*(s ...

  6. BZOJ 3544: [ONTAK2010]Creative Accounting( BST )

    题意 : 一段序列 , 求一段子序列和取余 M 的最大值 其实是一道水题... 前缀和 , 然后就是找 ( sum( r ) - sum( l ) ) % M 的最大值 . 考虑一个 sum( r ) ...

  7. .htaccess文件设置

    1.为使.htaccess有效,需要先做httpd.conf设置 #打开改写模式Options FollowSymLinks AllowOverride All#打开重写模式,去掉这行注释LoadMo ...

  8. Tomcat 常规配置并通过zabbix 监控 jvm状态

    一:jdk和tomcat基础 apache有两种方式运行php,一是使用模块,二是使用fastcgi nginx也可以通过fastcgi处理动态请求,也可以转发至tomcat tomcat监控主要是监 ...

  9. Oracle中奇怪的【不等于号】

    Oracle中奇怪的[不等于号]   在Oracle中,不等号有三种:<>,!=,^= 例如: select * from test where name<>'xn'.返回的结 ...

  10. 使用jstl 截取字符串

    时常碰见这样的 问题:获取数据库中的文本域的时候经常是在p标签中的,在页面显示的时候也是带着p标签,如何去除p标签呢 这里提供一个使用jstl的方式 1.首先导入jstl的函数标签库 <%@ t ...