B树的实现与源代码二(删除源代码)
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树的实现与源代码二(删除源代码)的更多相关文章
- Android源代码因删除所有git仓库导致的编译错误
/******************************************************************************** * Android源代码因删除所有g ...
- 数据结构系列之2-3树的插入、查找、删除和遍历完整版代码实现(dart语言实现)
弄懂了二叉树以后,再来看2-3树.网上.书上看了一堆文章和讲解,大部分是概念,很少有代码实现,尤其是删除操作的代码实现.当然,因为2-3树的特性,插入和删除都是比较复杂的,因此经过思考,独创了删除时分 ...
- OpenLayers 项目完整分析——(二)源代码总体结构分析
转自:http://www.cnblogs.com/lzlynn/archive/2008/07/29/1255848.html 二)源代码总体结构分析 通过前面的项目介绍,我们大概已经知道Openl ...
- Memcached源代码分析 - Memcached源代码分析之消息回应(3)
文章列表: <Memcached源代码分析 - Memcached源代码分析之基于Libevent的网络模型(1)> <Memcached源代码分析 - Memcached源代码分析 ...
- 数据结构系列之2-3-4树的插入、查找、删除和遍历完整版源代码实现与分析(dart语言实现)
本文属于原创,转载请注明来源. 在上一篇博文中,详细介绍了2-3树的操作(具体地址:https://www.cnblogs.com/outerspace/p/10861488.html),那么对于更多 ...
- B树的查找、插入、删除(附源代码)
B-Tree Index B-Tree搜索 B-Tree插入 分裂节点 插入节点 B-Tree删除 合并节点 删除节点 Basic B-Tree有两个比较重要的性质: 所有的leaf均在同一个leve ...
- 项目管理实践教程二、源代码控制【Source Control Using VisualSVN Server and TortoiseSVN】
在第一篇文章 项目管理实践教程一.工欲善其事,必先利其器[Basic Tools]发布后,根据大家的回复,我需要向大家说明几个问题: 1.为什么要用VisualSVN Server,而不用Subver ...
- AVL树(查找、插入、删除)——C语言
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树(AVL树是根据它的发明者G. M. Adelson-Velskii和E. M. Land ...
- AVL树C++实现(插入,删除,查找,清空,遍历操作)
AVL.h文件代码 #pragma once #include<iostream> #include<stack> #include <assert.h> usin ...
随机推荐
- There is an error in invoking javac. A full JDK (not just JRE) is required
最近调整了磁盘分区,硬盘里什么都没有了,可惜了我很多项目还有数据库资源然后把以前ssh项目重新导入进来的时候出现了一个错误org.apache.jasper.JasperException: PWC6 ...
- 数据结构——队列(Queues)
队列的存储特性:FIFO(first in first out)即先进先出原则 单向/双向队列 *优先队列(与queue不同) 存储方式: 带尾指针的单向链表 / 数组 queue类: queue() ...
- SQL Server SQL高级查询语句小结(转)
--select select * from student; --all 查询所有 select all sex from student; --distinct 过滤重复 select disti ...
- hdu4597 Play Game
Play Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Sub ...
- Parrot源代码分析之海贼王
我们的目的是找到speedup-example在使用Parrot加速的原因,假设仅仅说它源于Context Switch的降低,有点简单了,它究竟为什么降低了?除了Context Switch外是否还 ...
- [Swust OJ 217]--Factor(数论,类素数表)
题目链接:http://acm.swust.edu.cn/problem/0217/ Time limit(ms): 2000 Memory limit(kb): 65535 Descripti ...
- .htaccess文件设置
1.为使.htaccess有效,需要先做httpd.conf设置 #打开改写模式Options FollowSymLinks AllowOverride All#打开重写模式,去掉这行注释LoadMo ...
- USACO The Tamworth Two 模拟
一道模拟题不过要担心的是牛或者人在转弯的时候,另一方如果能走,那么要走,不能停留. 还是蛮简单的. 调试输出的话可以看到具体追击过程 Source Code: /* ID: wushuai2 PROG ...
- <climits>头文件使用方法
<climits>头文件定义的符号常量 CHAR_MIN char的最小值SCHAR_MAX signed char 最大值SCHAR_MIN signed char 最小值UCH ...
- 135实例——add_4
自我检讨,基础太差了.找了一本135个实例的pdf文档,一个个往后面编吧,希望能巩固一下基础 //date : 2013/8/19 //designer :pengxiaoen //function ...