B树的实现与源代码二(删除源代码)

来源:互联网 发布:电子数据的作用 编辑:程序博客网 时间:2024/06/10 12:53
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 1if ( 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 2else if ( i < x->size && k == x->key[i] && !x->leaf ){BNode *y = x->child[i];BNode *z = x->child[i + 1];// 2aif ( y->size >= t )  {int k_ = BTreeMaximum( y );x->key[i] = k_;BTreeDelete( y, k_ );}// 2belse if ( z->size >= t ){int k_ = BTreeMinimum( z );x->key[i] = k_;BTreeDelete( z, k_ );}// 2celse{// update the node yy->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 xfor ( 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 zdelete z;BTreeDelete( y, k );} // end else 2c} // end if case 2// case 3else 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 xx->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 xx->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 xfor ( 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 xfor ( 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 3else{BTreeDelete( x->child[i], k );        }//}}

原创粉丝点击