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 29
29
#include < memory>
30
30
31
31
#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
35
36
36
37
namespace alg {
37
38
class BTree {
@@ -217,7 +218,7 @@ namespace alg {
217
218
}
218
219
219
220
/* *
220
- * recursion deletion
221
+ * recursive deletion.
221
222
*/
222
223
void delete_op (node x, int32_t k) {
223
224
int32_t i;
@@ -240,22 +241,53 @@ namespace alg {
240
241
node y= READ (x, i-1 );
241
242
if (y->n >= T) { // case 2a
242
243
x->key [i] = y->key [y->n -1 ]; // subsitute the key with predecessor
244
+ WRITE (x);
245
+
243
246
delete_op (y, x->key [i]);
244
247
free (y);
245
248
return ;
246
249
}
250
+ free (y);
247
251
248
252
node z = READ (x, i+1 );
249
253
if (z->n >= T) { // case 2b
250
254
x->key [i] = z->key [0 ];
255
+ WRITE (x);
251
256
delete_op (z, x->key [i]);
252
257
return ;
253
258
}
259
+ free (z);
254
260
255
261
// case 2c:
256
262
if (y->n == T-1 && z->n == T-1 ) {
263
+ // merge k & z into y
264
+ y->key [y->n ] = k;
257
265
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 ;
258
289
}
290
+
259
291
delete_case3 (x);
260
292
}
261
293
}
You can’t perform that action at this time.
0 commit comments