@@ -225,7 +225,7 @@ namespace alg {
225
225
if (x->n == 0 ) { // emtpy node
226
226
return ;
227
227
}
228
-
228
+
229
229
i = x->n - 1 ;
230
230
while (i>=0 && k < x->key [i]) { // search the key.
231
231
i = i - 1 ;
@@ -289,59 +289,119 @@ namespace alg {
289
289
} else { // case 3
290
290
i = i+1 ; // child to search
291
291
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 ];
315
333
}
334
+
335
+ WRITE (ci.get ());
336
+ WRITE (x);
337
+ WRITE (right.get ());
338
+ delete_op (ci.get (), k);
339
+ return ;
316
340
}
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 ];
339
385
}
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);
340
400
}
341
401
}
342
- }
343
402
344
- return ;
403
+ return ;
404
+ }
345
405
}
346
406
347
407
0 commit comments