莫名其妙调试通过了!WC

This commit is contained in:
建峰 2024-06-24 01:27:11 +08:00
parent 63320bd01e
commit 8f5a994802

View File

@ -1416,9 +1416,12 @@ static struct _tree_node* tree_turn_left(struct _tree* self, struct _tree_node*
{ {
assert(self != NULL); assert(self != NULL);
assert(root != NULL); assert(root != NULL);
assert(root->right != NULL);
struct _tree_node* node = root->right; struct _tree_node* node = root->right;
if(node == NULL)
{
return root;
}
if(root->parent != NULL) if(root->parent != NULL)
{ {
if(root->parent->left == root) // step1 if(root->parent->left == root) // step1
@ -1445,9 +1448,12 @@ static struct _tree_node* tree_turn_right(struct _tree* self, struct _tree_node*
{ {
assert(self != NULL); assert(self != NULL);
assert(root != NULL); assert(root != NULL);
assert(root->left != NULL);
struct _tree_node* node = root->left; struct _tree_node* node = root->left;
if(node == NULL)
{
return root;
}
if(root->parent != NULL) if(root->parent != NULL)
{ {
if(root->parent->left == root) if(root->parent->left == root)
@ -1528,7 +1534,11 @@ static bool tree_avl_rebalance(struct _tree* self, struct _tree_node* root)
{ {
return true; return true;
} }
if(root->left == NULL && root->right == NULL)
{
return true;
}
tree_set_balance(self, root); tree_set_balance(self, root);
int balance = root->balance; int balance = root->balance;
if(balance > 1) if(balance > 1)
@ -1725,6 +1735,10 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node*
node->right->parent = node->parent; node->right->parent = node->parent;
node->parent->left = node->right; node->parent->left = node->right;
} }
else
{
node->parent->left = NULL;
}
} }
else if(node->parent->right == node) else if(node->parent->right == node)
{ {
@ -1738,6 +1752,10 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node*
node->right->parent = node->parent; node->right->parent = node->parent;
node->parent->right = node->right; node->parent->right = node->right;
} }
else
{
node->parent->right = NULL;
}
} }
self->rebalance(self, node->parent); self->rebalance(self, node->parent);
@ -1801,6 +1819,8 @@ bool tree_avl_delete(struct _tree* self, void* obj)
{ {
node->parent->right = NULL; node->parent->right = NULL;
} }
self->rebalance(self, node->parent);
} }
tree_node_free(node); tree_node_free(node);
} }