删除节点时有概率卡死

This commit is contained in:
建峰 2024-06-24 14:00:09 +08:00
parent ca4bf14b0c
commit 59e84f7131

View File

@ -1737,13 +1737,19 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node*
{ {
if(node->left != NULL) if(node->left != NULL)
{ {
node->left->parent = NULL; node->left->parent = NULL; // step1
self->_root = node->left; self->_root = node->left; // step2
// options
node->left = NULL;
} }
else if(node->right != NULL) else if(node->right != NULL)
{ {
node->right->parent = NULL; node->right->parent = NULL; // step1
self->_root = node->right; self->_root = node->right; // step2
// options
node->right = NULL;
} }
else else
{ {
@ -1756,34 +1762,60 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node*
{ {
if(node->left != NULL) if(node->left != NULL)
{ {
node->left->parent = node->parent; node->left->parent = node->parent; // step1
node->parent->left = node->left; node->parent->left = node->left; // step2
node->left->right = node->right; // step3 : NULL for singly child
// options
node->left = NULL;
node->parent = NULL;
} }
else if(node->right != NULL) else if(node->right != NULL)
{ {
node->right->parent = node->parent; node->right->parent = node->parent; // step1
node->parent->left = node->right; node->parent->left = node->right; // step2
node->right->left = node->left; // step3 : NULL for singly child
// options
node->right = NULL;
node->parent = NULL;
} }
else else
{ {
node->parent->left = NULL; node->parent->left = NULL;
// options
node->parent = NULL;
} }
} }
else if(node->parent->right == node) else if(node->parent->right == node)
{ {
if(node->left != NULL) if(node->left != NULL)
{ {
node->left->parent = node->parent; node->left->parent = node->parent; // step1
node->parent->right = node->left; node->parent->right = node->left; // step2
node->left->right = node->right; // step3 : NULL for singly child
// options
node->left = NULL;
node->parent = NULL;
} }
else if(node->right != NULL) else if(node->right != NULL)
{ {
node->right->parent = node->parent; node->right->parent = node->parent; // step1
node->parent->right = node->right; node->parent->right = node->right; // step2
node->right->left = node->left; // step3 : NULL for singly child
// options
node->right = NULL;
node->parent = NULL;
} }
else else
{ {
node->parent->right = NULL; node->parent->right = NULL;
// options
node->parent = NULL;
} }
} }
@ -1801,11 +1833,11 @@ static bool tree_avl_delete_double_child(struct _tree* self, struct _tree_node*
if(tmp != NULL) if(tmp != NULL)
{ {
memmove(node->obj, tmp->obj, self->_obj_size); memmove(node->obj, tmp->obj, self->_obj_size);
if(tmp->right != NULL) // if(tmp->right != NULL)
{ // {
node->right = tmp->right; // node->right = tmp->right;
tmp->right->parent = node; // tmp->right->parent = node;
} // }
tree_avl_delete_single_child(self, tmp); tree_avl_delete_single_child(self, tmp);
} }
return true; return true;