修改左旋和右旋不合理导致卡死的情况

This commit is contained in:
建峰 2024-06-24 16:59:42 +08:00
parent 3a2357e2a8
commit 6dc2271ab8
2 changed files with 32 additions and 17 deletions

View File

@ -1422,11 +1422,15 @@ static struct _tree_node* tree_turn_left(struct _tree* self, struct _tree_node*
return root; return root;
} }
if(root->parent != NULL) if(root->parent == NULL)
{ {
if(root->parent->left == root) // step1 self->_root = node; // step1
}
else
{ {
root->parent->left = node; if(root->parent->left == root)
{
root->parent->left = node; // step1
} }
else if(root->parent->right == root) else if(root->parent->right == root)
{ {
@ -1437,7 +1441,11 @@ static struct _tree_node* tree_turn_left(struct _tree* self, struct _tree_node*
root->parent = node; // step3 root->parent = node; // step3
root->right = node->left; // step4 root->right = node->left; // step4
node->left = root; // step5 if(node->left != NULL)
{
node->left->parent = root; // step5
}
node->left = root; // step6
tree_set_balance(self, root); tree_set_balance(self, root);
tree_set_balance(self, node); tree_set_balance(self, node);
@ -1454,7 +1462,11 @@ static struct _tree_node* tree_turn_right(struct _tree* self, struct _tree_node*
return root; return root;
} }
if(root->parent != NULL) if(root->parent == NULL)
{
self->_root = node; // step1
}
else
{ {
if(root->parent->left == root) if(root->parent->left == root)
{ {
@ -1469,7 +1481,11 @@ static struct _tree_node* tree_turn_right(struct _tree* self, struct _tree_node*
root->parent = node; // step3 root->parent = node; // step3
root->left = node->right; // step4 root->left = node->right; // step4
node->right = root; // step5 if(node->right != NULL)
{
node->right->parent = root; // step5
}
node->right = root; // step6
tree_set_balance(self, root); tree_set_balance(self, root);
tree_set_balance(self, node); tree_set_balance(self, node);
@ -1521,10 +1537,10 @@ int32_t tree_height(struct _tree* self, struct _tree_node* root)
* *
* | Çé¿ö | root->balance | node->balance | µ÷Õû·½Ê½ | * | Çé¿ö | root->balance | node->balance | µ÷Õû·½Ê½ |
* | ---- | ------------ | -------------- | -------- | * | ---- | ------------ | -------------- | -------- |
* | 1 | 2 | 1 | ×óÐý * | 1 | 2 | >= 0 | ×óÐý
* | 2 | 2 | -1 | ÏÈÓÒÐýºó×óÐý * | 2 | 2 | < 0 | ÏÈÓÒÐýºó×óÐý
* | 3 | -2 | -1 | ÓÒÐý * | 3 | -2 | <= 0 | ÓÒÐý
* | 4 | -2 | 1 | ÏÈ×óÐýºóÓÒÐý * | 4 | -2 | > 0 | ÏÈ×óÐýºóÓÒÐý
* *
* @param self * @param self
* @return true * @return true
@ -1547,22 +1563,22 @@ static bool tree_avl_rebalance(struct _tree* self, struct _tree_node* root)
int balance = root->balance; int balance = root->balance;
if(balance == 2) if(balance == 2)
{ {
if(root->right->balance == 1) if(root->right->balance >= 0)
{ {
root = tree_turn_left(self, root); root = tree_turn_left(self, root);
} }
else if(root->right->balance == -1) else
{ {
root = tree_trun_right_then_left(self, root); root = tree_trun_right_then_left(self, root);
} }
} }
else if(balance == -2) else if(balance == -2)
{ {
if(root->left->balance == -1) if(root->left->balance <= 0)
{ {
root = tree_turn_right(self, root); root = tree_turn_right(self, root);
} }
else if(root->left->balance == 1) else
{ {
root = tree_trun_left_then_right(self, root); root = tree_trun_left_then_right(self, root);
} }

View File

@ -338,7 +338,6 @@ void test_tree_num(void)
printf("\n"); printf("\n");
printf("----- left priority -----\n"); printf("----- left priority -----\n");
tree->order(tree, false); tree->order(tree, false);
printf("----- breadth -----\n"); printf("----- breadth -----\n");
@ -351,13 +350,13 @@ void test_tree_num(void)
printf("delete = "); printf("delete = ");
tree->print_obj(&temp); tree->print_obj(&temp);
printf("size = %2d\n", tree->size(tree)); printf("size = %2d : ", tree->size(tree));
tree->delete(tree, &temp); tree->delete(tree, &temp);
// printf("----- breadth -----\n"); // printf("----- breadth -----\n");
// tree->breadth(tree, tree->_root); // tree->breadth(tree, tree->_root);
printf("----- preorder -----\n"); // printf("----- preorder -----\n");
tree->preorder(tree, tree->_root); tree->preorder(tree, tree->_root);
printf("\n"); printf("\n");
} }