修复删除根节点的bug

This commit is contained in:
建峰 2024-06-24 09:43:40 +08:00
parent 4b306fe831
commit 4c450fd157
3 changed files with 58 additions and 23 deletions

View File

@ -1,6 +1,6 @@
# 0. cmake 最低版本号要求
cmake_minimum_required(VERSION 3.28)
cmake_minimum_required(VERSION 3.27)
# 0. 项目信息
project(demo)

View File

@ -1717,12 +1717,18 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node*
{
if(node->left != NULL)
{
node->left->parent = NULL;
self->_root = node->left;
}
else if(node->right != NULL)
{
node->right->parent = NULL;
self->_root = node->right;
}
else
{
self->_root = NULL;
}
}
else
{
@ -1772,7 +1778,7 @@ static bool tree_avl_delete_double_child(struct _tree* self, struct _tree_node*
assert(self != NULL);
assert(node != NULL);
struct _tree_node* tmp = self->find_min(self, node->right);
if(tmp != NULL)
if(tmp == NULL)
{
return false;
}
@ -1802,31 +1808,32 @@ bool tree_avl_delete(struct _tree* self, void* obj)
{
tree_avl_delete_double_child(self, node);
}
else if(node->left != NULL || node->right != NULL)
else
// else if(node->left != NULL || node->right != NULL)
{
tree_avl_delete_single_child(self, node);
}
else
{
if(node->parent == NULL)
{
self->_root = NULL;
}
else
{
if(node->parent->left == node)
{
node->parent->left = NULL;
}
else if(node->parent->right == node)
{
node->parent->right = NULL;
}
// else
// {
// if(node->parent == NULL)
// {
// self->_root = NULL;
// }
// else
// {
// if(node->parent->left == node)
// {
// node->parent->left = NULL;
// }
// else if(node->parent->right == node)
// {
// node->parent->right = NULL;
// }
self->rebalance(self, node->parent);
}
tree_node_free(node);
}
// self->rebalance(self, node->parent);
// }
// tree_node_free(node);
// }
self->_size--;
return true;
@ -1889,6 +1896,11 @@ void tree_order(struct _tree* self, bool right_priority)
void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
{
assert(self != NULL);
if(root == NULL)
{
return;
}
if(!self->_right_priority)
{
self->print_obj(root->obj);
@ -1918,6 +1930,11 @@ void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
{
assert(self != NULL);
if(root == NULL)
{
return;
}
if(!self->_right_priority)
{
if(root->left != NULL)
@ -1947,6 +1964,11 @@ void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
{
assert(self != NULL);
if(root == NULL)
{
return;
}
if(!self->_right_priority)
{
if(root->left != NULL)
@ -1977,6 +1999,11 @@ void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
void tree_avl_breadth(struct _tree* self, struct _tree_node* root)
{
assert(self != NULL);
if(root == NULL)
{
return;
}
struct _tree_node* node = self->_root;
queue_t queue = queue_new();
queue_init(queue, sizeof(struct _tree_node*));

View File

@ -279,8 +279,10 @@ void tree_test(void)
void test_tree_num(void)
{
uint32_t i = 0;
// int data[] = { 2,1,3,4};
// int data[] = { 1,2,3,4,5,6};
int data[] = { 5,2,3,1,7,8,6 };
// int data[] = { 5,2,3,1,7,8,6,4,9,10,12,11,15,14,13 };
int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]);
@ -335,6 +337,10 @@ void test_tree_num(void)
printf("----- left priority -----\n");
tree->order(tree, false);
printf("----- breadth -----\n");
tree->breadth(tree, tree->_root);
printf("\n");
for (i = 0; i < len; i++)
{
temp = data[i];
@ -347,6 +353,8 @@ void test_tree_num(void)
printf("----- breadth -----\n");
tree->breadth(tree, tree->_root);
printf("----- inorder -----\n");
tree->inorder(tree, tree->_root);
printf("\n");
}