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 );
}
//
} }

最新文章

  1. CentOS7:安装Puppet
  2. 电赛总结(二)&mdash;&mdash;AD芯片总结之高速AD9224
  3. Ubuntu中Eclipse安装与配置
  4. hdu4714Tree2cycle
  5. DDD的好文章
  6. 如何扩展大规模Web网站的性能?
  7. linux shell pushd popd dirs命令
  8. ssh配置事务
  9. BZOJ1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富
  10. 通过SVG与CSS3实现向上图标
  11. 51ak带你看MYSQL5.7源码2:编译现有的代码
  12. 基于hashchange导航管理
  13. 【NOI赛前训练】——专项测试1&#183;网络流
  14. luoguP4705 玩游戏
  15. Python成绩雷达图
  16. Math中的floor,round和ceil方法总结
  17. CSS3实战开发: 折角效果实战开发
  18. Smart Disk -- proposed by Liyuan Liu
  19. Answer the questions(回答自己的问题)
  20. 递归查询SQL语句

热门文章

  1. RMAN多种备份脚本分享
  2. 修改MojoWeixin 只保留用户name 取消群昵称
  3. IT第四天 - 运算符、随机数、Math类
  4. linux下的压缩解压命令 tar 的简单描述
  5. UVA 103 Stacking Boxes (dp + DAG上的最长路径 + 记忆化搜索)
  6. poj 3281 Dining 网络流-最大流-建图的题
  7. 使用SharedPreferences即时存储之后,不能即时获取到数据
  8. SQL查询各阶段的统计信息
  9. zIndex属性在IE中无效
  10. Oracle中的单引号问题