Skip to content

Commit 0e6e367

Browse files
committed
update btree, case 3
1 parent aac5c9a commit 0e6e367

File tree

1 file changed

+108
-48
lines changed

1 file changed

+108
-48
lines changed

include/btree.h

Lines changed: 108 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ namespace alg {
225225
if (x->n == 0) { // emtpy node
226226
return;
227227
}
228-
228+
229229
i = x->n - 1;
230230
while (i>=0 && k < x->key[i]) { // search the key.
231231
i = i - 1;
@@ -289,59 +289,119 @@ namespace alg {
289289
} else { // case 3
290290
i = i+1; // child to search
291291
std::auto_ptr<node_t> ci(READ(x, i));
292-
293-
if (ci->n == T-1) { // case 3a.
294-
if (i-1>=0) {
295-
std::auto_ptr<node_t> left(READ(x, i-1)); // left sibling
296-
if (left->n > T) {
297-
int j;
298-
for (j=ci->n-2;j>=0;j++) { // right shift ci keys
299-
ci->key[j+1] = ci->key[j];
300-
}
301-
302-
for (j=ci->n-1;j>=0;j++) { // right shift ci childs
303-
ci->c[j+1] = ci->c[j];
304-
}
305-
ci->n = ci->n+1;
306-
ci->key[0] = x->key[i]; // copy key from x[i] to ci[0]
307-
ci->c[0] = left->c[left->n]; // copy child pointer from left last child
308-
x->key[i] = left->key[left->n-1]; // copy from left last key
309-
left->n = left->n-1; // decrease left num keys
310-
311-
WRITE(ci.get());
312-
WRITE(x);
313-
WRITE(left.get());
314-
delete_op(ci.get(), k);
292+
293+
// case 3a. left sibling
294+
if (ci->n == T-1) {
295+
std::auto_ptr<node_t> left(READ(x, i-1));
296+
if (i-1>=0 && left->n > T) {
297+
int j;
298+
for (j=ci->n-2;j>=0;j++) { // right shift ci keys
299+
ci->key[j+1] = ci->key[j];
300+
}
301+
302+
for (j=ci->n-1;j>=0;j++) { // right shift ci childs
303+
ci->c[j+1] = ci->c[j];
304+
}
305+
ci->n = ci->n+1;
306+
ci->key[0] = x->key[i]; // copy key from x[i] to ci[0]
307+
ci->c[0] = left->c[left->n]; // copy child pointer from left last child
308+
x->key[i] = left->key[left->n-1]; // copy from left last key
309+
left->n = left->n-1; // decrease left num keys
310+
311+
WRITE(ci.get());
312+
WRITE(x);
313+
WRITE(left.get());
314+
delete_op(ci.get(), k);
315+
return;
316+
}
317+
318+
// case 3a. right sibling
319+
std::auto_ptr<node_t> right(READ(x, i+1));
320+
if (i+1<ci->n && right->n > T) {
321+
ci->key[ci->n-1] = x->key[i];
322+
ci->c[ci->n] = right->c[0];
323+
ci->n = ci->n+1;
324+
x->key[i] = right->key[0];
325+
326+
int j;
327+
for (j=0;j<right->n-1;j++) { // left shift sibling keys
328+
right->key[j] = right->key[j+1];
329+
}
330+
331+
for (j=0;j<right->n;j++) { // left shift ci childs
332+
right->c[j] = right->c[j+1];
315333
}
334+
335+
WRITE(ci.get());
336+
WRITE(x);
337+
WRITE(right.get());
338+
delete_op(ci.get(), k);
339+
return;
316340
}
317-
318-
if (i+1<ci->n) {
319-
std::auto_ptr<node_t> right(READ(x, i+1)); // right sibling
320-
if (right->n > T) {
321-
ci->key[ci->n-1] = x->key[i];
322-
ci->c[ci->n] = right->c[0];
323-
ci->n = ci->n+1;
324-
x->key[i] = right->key[0];
325-
326-
int j;
327-
for (j=0;j<right->n-1;j++) { // left shift sibling keys
328-
right->key[j] = right->key[j+1];
329-
}
330-
331-
for (j=0;j<right->n;j++) { // left shift ci childs
332-
right->c[j] = right->c[j+1];
333-
}
334-
335-
WRITE(ci.get());
336-
WRITE(x);
337-
WRITE(right.get());
338-
delete_op(ci.get(), k);
341+
342+
// case 3b.
343+
if (left->n == T-1) {
344+
// copy x[i] to left
345+
left->key[left->n] = x->key[i];
346+
left->n = left->n + 1;
347+
348+
// shift x
349+
int j;
350+
for (j=i;j<x->n-1;j++) {
351+
x->key[j] = x->key[j+1];
352+
}
353+
354+
for (j=i+1;j<x->n;j++) { // always overwrite right child
355+
x->c[j] = x->c[j+1];
356+
}
357+
358+
// append ci into left sibling
359+
for (j=0;j<ci->n;j++) {
360+
left->key[j+left->n] = ci->key[j];
361+
}
362+
363+
for (j=0;j<ci->n+1;j++) {
364+
left->c[j+left->n] = ci->c[j];
365+
}
366+
left->n += ci->n; // left became 2T-1
367+
ci->flag |= MARKFREE; // free ci
368+
WRITE(ci.get());
369+
WRITE(x);
370+
WRITE(left.get());
371+
delete_op(left.get(), k);
372+
} else {
373+
// copy x[i] to ci
374+
ci->key[ci->n] = x->key[i];
375+
ci->n = ci->n + 1;
376+
377+
// shift x
378+
int j;
379+
for (j=i;j<x->n-1;j++) {
380+
x->key[j] = x->key[j+1];
381+
}
382+
383+
for (j=i+1;j<x->n;j++) { // always overwrite right child
384+
x->c[j] = x->c[j+1];
339385
}
386+
387+
// append right sibling into ci
388+
for (j=0;j<right->n;j++) {
389+
ci->key[ci->n+j] = right->key[j];
390+
}
391+
392+
for (j=0;j<left->n+1;j++) {
393+
ci->c[ci->n+j] = right->c[j];
394+
}
395+
right->flag |= MARKFREE;
396+
WRITE(ci.get());
397+
WRITE(x);
398+
WRITE(right.get());
399+
delete_op(ci.get(),k);
340400
}
341401
}
342-
}
343402

344-
return;
403+
return;
404+
}
345405
}
346406

347407

0 commit comments

Comments
 (0)