Skip to content

Commit 787da1d

Browse files
committed
adding btree delete
1 parent 5c1e195 commit 787da1d

File tree

1 file changed

+36
-4
lines changed

1 file changed

+36
-4
lines changed

include/btree.h

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,10 @@
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

3637
namespace alg {
3738
class BTree {
@@ -217,7 +218,7 @@ namespace alg {
217218
}
218219

219220
/**
220-
* recursion deletion
221+
* recursive deletion.
221222
*/
222223
void delete_op(node x, int32_t k) {
223224
int32_t i;
@@ -240,22 +241,53 @@ namespace alg {
240241
node y= READ(x, i-1);
241242
if (y->n >= T) { // case 2a
242243
x->key[i] = y->key[y->n-1]; // subsitute the key with predecessor
244+
WRITE(x);
245+
243246
delete_op(y, x->key[i]);
244247
free(y);
245248
return;
246249
}
250+
free(y);
247251

248252
node z = READ(x, i+1);
249253
if (z->n >= T) { // case 2b
250254
x->key[i] = z->key[0];
255+
WRITE(x);
251256
delete_op(z, x->key[i]);
252257
return;
253258
}
259+
free(z);
254260

255261
// case 2c:
256262
if (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+
259291
delete_case3(x);
260292
}
261293
}

0 commit comments

Comments
 (0)