mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-07-03 23:56:54 +08:00
添加注释和理解
This commit is contained in:
parent
0901b08417
commit
e1763db190
14
src/tree.c
14
src/tree.c
@ -1188,33 +1188,46 @@ bool tree_rb_delete_fix(struct _tree* self, struct _tree_node* node)
|
|||||||
brother = father->right;
|
brother = father->right;
|
||||||
if(brother->color == RBT_RED)
|
if(brother->color == RBT_RED)
|
||||||
{
|
{
|
||||||
|
// case 1
|
||||||
|
// father is black, brother is red
|
||||||
|
// brother has two black children
|
||||||
|
// so ...
|
||||||
brother->color = RBT_BLACK;
|
brother->color = RBT_BLACK;
|
||||||
father->color = RBT_RED;
|
father->color = RBT_RED;
|
||||||
tmp = tree_turn_left(self, father);
|
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)
|
else if(brother->right != NULL && brother->right->color == RBT_RED)
|
||||||
{
|
{
|
||||||
|
// case 2
|
||||||
brother->color = father->color;
|
brother->color = father->color;
|
||||||
father->color = RBT_BLACK;
|
father->color = RBT_BLACK;
|
||||||
brother->right->color = RBT_BLACK;
|
brother->right->color = RBT_BLACK;
|
||||||
node = tree_turn_left(self, father);
|
node = tree_turn_left(self, father);
|
||||||
|
// After deleting the node, it remains balanced
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(brother->left != NULL && brother->left->color == RBT_RED)
|
else if(brother->left != NULL && brother->left->color == RBT_RED)
|
||||||
{
|
{
|
||||||
|
// case 3
|
||||||
brother->color = RBT_RED;
|
brother->color = RBT_RED;
|
||||||
brother->left->color = RBT_BLACK;
|
brother->left->color = RBT_BLACK;
|
||||||
tmp = tree_turn_right(self, brother);
|
tmp = tree_turn_right(self, brother);
|
||||||
|
// Convert to case2
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// father is black, after delete node, total of black is -1
|
||||||
if(father->color = RBT_BLACK)
|
if(father->color = RBT_BLACK)
|
||||||
{
|
{
|
||||||
|
// case 4
|
||||||
brother->color = RBT_RED;
|
brother->color = RBT_RED;
|
||||||
node = father;
|
node = father;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// case 5
|
||||||
brother->color = RBT_RED;
|
brother->color = RBT_RED;
|
||||||
father->color = RBT_BLACK;
|
father->color = RBT_BLACK;
|
||||||
break;
|
break;
|
||||||
@ -1263,7 +1276,6 @@ bool tree_rb_delete_fix(struct _tree* self, struct _tree_node* node)
|
|||||||
if(tmp != NULL && tmp->parent == NULL)
|
if(tmp != NULL && tmp->parent == NULL)
|
||||||
{
|
{
|
||||||
self->_root = node;
|
self->_root = node;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user