设为首页 加入收藏

TOP

B树的实现与源代码二(删除源代码)(一)
2014-11-23 21:46:37 来源: 作者: 【 】 浏览:16
Tags:实现 源代码 删除
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] =
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇 Uva 12537 Radiation 下一篇二分匹配模版

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·一篇说人话的文章, (2025-12-27 07:50:09)
·Python Web框架哪家 (2025-12-27 07:50:06)
·基于Python的数据分 (2025-12-27 07:50:03)
·深入理解 Java 集合 (2025-12-27 07:22:48)
·Java集合框架全面解 (2025-12-27 07:22:45)