修复删除根节点的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 最低版本号要求 # 0. cmake 最低版本号要求
cmake_minimum_required(VERSION 3.28) cmake_minimum_required(VERSION 3.27)
# 0. 项目信息 # 0. 项目信息
project(demo) 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) if(node->left != NULL)
{ {
node->left->parent = NULL;
self->_root = node->left; self->_root = node->left;
} }
else if(node->right != NULL) else if(node->right != NULL)
{ {
node->right->parent = NULL;
self->_root = node->right; self->_root = node->right;
} }
else
{
self->_root = NULL;
}
} }
else else
{ {
@ -1772,7 +1778,7 @@ static bool tree_avl_delete_double_child(struct _tree* self, struct _tree_node*
assert(self != NULL); assert(self != NULL);
assert(node != NULL); assert(node != NULL);
struct _tree_node* tmp = self->find_min(self, node->right); struct _tree_node* tmp = self->find_min(self, node->right);
if(tmp != NULL) if(tmp == NULL)
{ {
return false; return false;
} }
@ -1802,31 +1808,32 @@ bool tree_avl_delete(struct _tree* self, void* obj)
{ {
tree_avl_delete_double_child(self, node); 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); tree_avl_delete_single_child(self, node);
} }
else // else
{ // {
if(node->parent == NULL) // if(node->parent == NULL)
{ // {
self->_root = NULL; // self->_root = NULL;
} // }
else // else
{ // {
if(node->parent->left == node) // if(node->parent->left == node)
{ // {
node->parent->left = NULL; // node->parent->left = NULL;
} // }
else if(node->parent->right == node) // else if(node->parent->right == node)
{ // {
node->parent->right = NULL; // node->parent->right = NULL;
} // }
self->rebalance(self, node->parent); // self->rebalance(self, node->parent);
} // }
tree_node_free(node); // tree_node_free(node);
} // }
self->_size--; self->_size--;
return true; 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) void tree_avl_preorder(struct _tree* self, struct _tree_node* root)
{ {
assert(self != NULL); assert(self != NULL);
if(root == NULL)
{
return;
}
if(!self->_right_priority) if(!self->_right_priority)
{ {
self->print_obj(root->obj); 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) void tree_avl_inorder(struct _tree* self, struct _tree_node* root)
{ {
assert(self != NULL); assert(self != NULL);
if(root == NULL)
{
return;
}
if(!self->_right_priority) if(!self->_right_priority)
{ {
if(root->left != NULL) 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) void tree_avl_postorder(struct _tree* self, struct _tree_node* root)
{ {
assert(self != NULL); assert(self != NULL);
if(root == NULL)
{
return;
}
if(!self->_right_priority) if(!self->_right_priority)
{ {
if(root->left != NULL) 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) void tree_avl_breadth(struct _tree* self, struct _tree_node* root)
{ {
assert(self != NULL); assert(self != NULL);
if(root == NULL)
{
return;
}
struct _tree_node* node = self->_root; struct _tree_node* node = self->_root;
queue_t queue = queue_new(); queue_t queue = queue_new();
queue_init(queue, sizeof(struct _tree_node*)); queue_init(queue, sizeof(struct _tree_node*));

View File

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