@@ -76,14 +76,12 @@ impl<K: Ord, V> RBTree<K, V> {
76
76
}
77
77
}
78
78
node = Box :: into_raw ( Box :: new ( RBNode :: new ( key, value) ) ) ;
79
- if !parent. is_null ( ) {
80
- if ( * node) . key < ( * parent) . key {
81
- ( * parent) . left = node;
82
- } else {
83
- ( * parent) . right = node;
84
- }
85
- } else {
79
+ if parent. is_null ( ) {
86
80
self . root = node;
81
+ } else if ( * node) . key < ( * parent) . key {
82
+ ( * parent) . left = node;
83
+ } else {
84
+ ( * parent) . right = node;
87
85
}
88
86
( * node) . parent = parent;
89
87
insert_fixup ( self , node) ;
@@ -258,17 +256,17 @@ unsafe fn insert_fixup<K: Ord, V>(tree: &mut RBTree<K, V>, mut node: *mut RBNode
258
256
259
257
gparent = ( * parent) . parent ;
260
258
tmp = ( * gparent) . right ;
261
- if parent != tmp {
262
- /* parent = (*gparent).left */
259
+ if parent == tmp {
260
+ /* parent = (*gparent).right */
261
+ tmp = ( * gparent) . left ;
263
262
if !tmp. is_null ( ) && matches ! ( ( * tmp) . color, Color :: Red ) {
264
263
/*
265
264
* Case 1 - color flips and recurse at g
266
- *
267
- * G g
268
- * / \ / \
269
- * p u --> P U
270
- * / /
271
- * n n
265
+ * G g
266
+ * / \ / \
267
+ * u p --> U P
268
+ * \ \
269
+ * n n
272
270
*/
273
271
274
272
( * parent) . color = Color :: Black ;
@@ -278,46 +276,45 @@ unsafe fn insert_fixup<K: Ord, V>(tree: &mut RBTree<K, V>, mut node: *mut RBNode
278
276
parent = ( * node) . parent ;
279
277
continue ;
280
278
}
281
- tmp = ( * parent) . right ;
279
+ tmp = ( * parent) . left ;
282
280
if node == tmp {
283
- /* node = (*parent).right */
284
281
/*
285
- * Case 2 - left rotate at p (then Case 3)
282
+ * Case 2 - right rotate at p (then Case 3)
286
283
*
287
- * G G
288
- * / \ / \
289
- * p U --> n U
290
- * \ /
291
- * n p
284
+ * G G
285
+ * / \ / \
286
+ * U p --> U n
287
+ * / \
288
+ * n p
292
289
*/
293
290
294
- left_rotate ( tree, parent) ;
291
+ right_rotate ( tree, parent) ;
295
292
parent = node;
296
293
}
297
294
/*
298
- * Case 3 - right rotate at g
295
+ * Case 3 - left rotate at g
299
296
*
300
- * G P
301
- * / \ / \
302
- * p U --> n g
303
- * / \
304
- * n U
297
+ * G P
298
+ * / \ / \
299
+ * U p --> g n
300
+ * \ /
301
+ * n U
305
302
*/
306
303
307
304
( * parent) . color = Color :: Black ;
308
305
( * gparent) . color = Color :: Red ;
309
- right_rotate ( tree, gparent) ;
306
+ left_rotate ( tree, gparent) ;
310
307
} else {
311
- /* parent = (*gparent).right */
312
- tmp = ( * gparent) . left ;
308
+ /* parent = (*gparent).left */
313
309
if !tmp. is_null ( ) && matches ! ( ( * tmp) . color, Color :: Red ) {
314
310
/*
315
311
* Case 1 - color flips and recurse at g
316
- * G g
317
- * / \ / \
318
- * u p --> U P
319
- * \ \
320
- * n n
312
+ *
313
+ * G g
314
+ * / \ / \
315
+ * p u --> P U
316
+ * / /
317
+ * n n
321
318
*/
322
319
323
320
( * parent) . color = Color :: Black ;
@@ -327,34 +324,35 @@ unsafe fn insert_fixup<K: Ord, V>(tree: &mut RBTree<K, V>, mut node: *mut RBNode
327
324
parent = ( * node) . parent ;
328
325
continue ;
329
326
}
330
- tmp = ( * parent) . left ;
327
+ tmp = ( * parent) . right ;
331
328
if node == tmp {
329
+ /* node = (*parent).right */
332
330
/*
333
- * Case 2 - right rotate at p (then Case 3)
331
+ * Case 2 - left rotate at p (then Case 3)
334
332
*
335
- * G G
336
- * / \ / \
337
- * U p --> U n
338
- * / \
339
- * n p
333
+ * G G
334
+ * / \ / \
335
+ * p U --> n U
336
+ * \ /
337
+ * n p
340
338
*/
341
339
342
- right_rotate ( tree, parent) ;
340
+ left_rotate ( tree, parent) ;
343
341
parent = node;
344
342
}
345
343
/*
346
- * Case 3 - left rotate at g
344
+ * Case 3 - right rotate at g
347
345
*
348
- * G P
349
- * / \ / \
350
- * U p --> g n
351
- * \ /
352
- * n U
346
+ * G P
347
+ * / \ / \
348
+ * p U --> n g
349
+ * / \
350
+ * n U
353
351
*/
354
352
355
353
( * parent) . color = Color :: Black ;
356
354
( * gparent) . color = Color :: Red ;
357
- left_rotate ( tree, gparent) ;
355
+ right_rotate ( tree, gparent) ;
358
356
}
359
357
break ;
360
358
}
@@ -377,7 +375,52 @@ unsafe fn delete_fixup<K: Ord, V>(tree: &mut RBTree<K, V>, mut parent: *mut RBNo
377
375
* black node count that is 1 lower than other leaf paths.
378
376
*/
379
377
sibling = ( * parent) . right ;
380
- if node != sibling {
378
+ if node == sibling {
379
+ /* node = (*parent).right */
380
+ sibling = ( * parent) . left ;
381
+ if matches ! ( ( * sibling) . color, Color :: Red ) {
382
+ /*
383
+ * Case 1 - right rotate at parent
384
+ */
385
+
386
+ right_rotate ( tree, parent) ;
387
+ ( * parent) . color = Color :: Red ;
388
+ ( * sibling) . color = Color :: Black ;
389
+ sibling = ( * parent) . right ;
390
+ }
391
+ sl = ( * sibling) . left ;
392
+ sr = ( * sibling) . right ;
393
+
394
+ if !sr. is_null ( ) && matches ! ( ( * sr) . color, Color :: Red ) {
395
+ /*
396
+ * Case 2 - left rotate at sibling and then right rotate at parent
397
+ */
398
+
399
+ ( * sr) . color = ( * parent) . color ;
400
+ ( * parent) . color = Color :: Black ;
401
+ left_rotate ( tree, sibling) ;
402
+ right_rotate ( tree, parent) ;
403
+ } else if !sl. is_null ( ) && matches ! ( ( * sl) . color, Color :: Red ) {
404
+ /*
405
+ * Case 3 - right rotate at parent
406
+ */
407
+
408
+ ( * sl) . color = ( * parent) . color ;
409
+ right_rotate ( tree, parent) ;
410
+ } else {
411
+ /*
412
+ * Case 4 - color flip
413
+ */
414
+
415
+ ( * sibling) . color = Color :: Red ;
416
+ if matches ! ( ( * parent) . color, Color :: Black ) {
417
+ node = parent;
418
+ parent = ( * node) . parent ;
419
+ continue ;
420
+ }
421
+ ( * parent) . color = Color :: Black ;
422
+ }
423
+ } else {
381
424
/* node = (*parent).left */
382
425
if matches ! ( ( * sibling) . color, Color :: Red ) {
383
426
/*
@@ -442,51 +485,6 @@ unsafe fn delete_fixup<K: Ord, V>(tree: &mut RBTree<K, V>, mut parent: *mut RBNo
442
485
* Sl Sr Sl Sr
443
486
*/
444
487
445
- ( * sibling) . color = Color :: Red ;
446
- if matches ! ( ( * parent) . color, Color :: Black ) {
447
- node = parent;
448
- parent = ( * node) . parent ;
449
- continue ;
450
- }
451
- ( * parent) . color = Color :: Black ;
452
- }
453
- } else {
454
- /* node = (*parent).right */
455
- sibling = ( * parent) . left ;
456
- if matches ! ( ( * sibling) . color, Color :: Red ) {
457
- /*
458
- * Case 1 - right rotate at parent
459
- */
460
-
461
- right_rotate ( tree, parent) ;
462
- ( * parent) . color = Color :: Red ;
463
- ( * sibling) . color = Color :: Black ;
464
- sibling = ( * parent) . right ;
465
- }
466
- sl = ( * sibling) . left ;
467
- sr = ( * sibling) . right ;
468
-
469
- if !sr. is_null ( ) && matches ! ( ( * sr) . color, Color :: Red ) {
470
- /*
471
- * Case 2 - left rotate at sibling and then right rotate at parent
472
- */
473
-
474
- ( * sr) . color = ( * parent) . color ;
475
- ( * parent) . color = Color :: Black ;
476
- left_rotate ( tree, sibling) ;
477
- right_rotate ( tree, parent) ;
478
- } else if !sl. is_null ( ) && matches ! ( ( * sl) . color, Color :: Red ) {
479
- /*
480
- * Case 3 - right rotate at parent
481
- */
482
-
483
- ( * sl) . color = ( * parent) . color ;
484
- right_rotate ( tree, parent) ;
485
- } else {
486
- /*
487
- * Case 4 - color flip
488
- */
489
-
490
488
( * sibling) . color = Color :: Red ;
491
489
if matches ! ( ( * parent) . color, Color :: Black ) {
492
490
node = parent;
0 commit comments