File tree Expand file tree Collapse file tree 1 file changed +36
-4
lines changed Expand file tree Collapse file tree 1 file changed +36
-4
lines changed Original file line number Diff line number Diff line change 2929#include < memory>
3030
3131#define BLOCKSIZE 4096
32- #define T 255
33- #define LEAF 0x0001
34- #define ONDISK 0x0002
32+ #define T 255
33+ #define LEAF 0x0001
34+ #define ONDISK 0x0002
35+ #define MARKFREE 0x0004
3536
3637namespace alg {
3738class BTree {
@@ -217,7 +218,7 @@ namespace alg {
217218}
218219
219220/* *
220- * recursion deletion
221+ * recursive deletion.
221222 */
222223void delete_op (node x, int32_t k) {
223224int32_t i;
@@ -240,22 +241,53 @@ namespace alg {
240241node y= READ (x, i-1 );
241242if (y->n >= T) {// case 2a
242243x->key [i] = y->key [y->n -1 ];// subsitute the key with predecessor
244+ WRITE (x);
245+
243246delete_op (y, x->key [i]);
244247free (y);
245248return ;
246249}
250+ free (y);
247251
248252node z = READ (x, i+1 );
249253if (z->n >= T) {// case 2b
250254x->key [i] = z->key [0 ];
255+ WRITE (x);
251256delete_op (z, x->key [i]);
252257return ;
253258}
259+ free (z);
254260
255261// case 2c:
256262if (y->n == T-1 && z->n == T-1 ) {
263+ // merge k & z into y
264+ y->key [y->n ] = k;
257265
266+ int j;
267+ for (j=0 ;j<z->n ;j++) {// merge n keys, k already in
268+ y->key [y->n +j+1 ] = z->key [j];
269+ }
270+ for (j=0 ;j<z->n +1 ;j++) {// merge n+1 childs
271+ y->c [y->n +j+1 ] = z->key [j];
272+ }
273+ // mark free this node
274+ z->flag |= MARKFREE;
275+ y->n = y->n + z->n + 1 ; // size after merge
276+ WRITE (z);
277+ WRITE (y);
278+
279+ // shift x
280+ for (j=i;j<x->n -1 ;j++) {
281+ x->key [i] = x->key [i+1 ];
282+ }
283+ x->n = x->n - 1 ;
284+ WRITE (x);
285+
286+ // recursive delete k
287+ delete_op (y, k);
288+ return ;
258289}
290+
259291delete_case3 (x);
260292}
261293}
You can’t perform that action at this time.
0 commit comments