From e1763db19083564936627ea1d46f74e62faa31ee Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Fri, 28 Jun 2024 11:32:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A=E5=92=8C?= =?UTF-8?q?=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/tree.c b/src/tree.c index ba335be..069aca4 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1188,33 +1188,46 @@ bool tree_rb_delete_fix(struct _tree* self, struct _tree_node* node) brother = father->right; if(brother->color == RBT_RED) { + // case 1 + // father is black, brother is red + // brother has two black children + // so ... brother->color = RBT_BLACK; father->color = RBT_RED; tmp = tree_turn_left(self, father); + // After deleting the node, it became unbalanced + // so convert to case5 } else if(brother->right != NULL && brother->right->color == RBT_RED) { + // case 2 brother->color = father->color; father->color = RBT_BLACK; brother->right->color = RBT_BLACK; node = tree_turn_left(self, father); + // After deleting the node, it remains balanced break; } else if(brother->left != NULL && brother->left->color == RBT_RED) { + // case 3 brother->color = RBT_RED; brother->left->color = RBT_BLACK; tmp = tree_turn_right(self, brother); + // Convert to case2 } else { + // father is black, after delete node, total of black is -1 if(father->color = RBT_BLACK) { + // case 4 brother->color = RBT_RED; node = father; } else { + // case 5 brother->color = RBT_RED; father->color = RBT_BLACK; break; @@ -1263,7 +1276,6 @@ bool tree_rb_delete_fix(struct _tree* self, struct _tree_node* node) if(tmp != NULL && tmp->parent == NULL) { self->_root = node; - break; } }