mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-07-03 23:56:54 +08:00
修复删除根节点的bug
This commit is contained in:
parent
4b306fe831
commit
4c450fd157
@ -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)
|
||||||
|
71
src/tree.c
71
src/tree.c
@ -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*));
|
||||||
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user