删除还没有添加

This commit is contained in:
建峰 2024-06-23 18:48:28 +08:00
parent 933374f308
commit 26245288cc
2 changed files with 49 additions and 4 deletions

View File

@ -1535,7 +1535,41 @@ bool tree_avl_insert(struct _tree* self, void* obj)
bool tree_avl_delete(struct _tree* self, void* obj) bool tree_avl_delete(struct _tree* self, void* obj)
{ {
assert(self != NULL);
assert(obj != NULL);
assert(self->compare != NULL);
// if
if(self->empty(self))
{
return false;
}
else
{
struct _tree_node* node = self->find(self, obj);
if(node == NULL)
{
return false;
}
if(obj != NULL)
{
memmove(obj, node->obj, self->_obj_size);
}
if(node->parent->left == node)
{
node->parent->left = NULL;
}
else if(node->parent->right == node)
{
}
tree_node_free(node);
}
self->_size--;
return true;
} }
struct _tree_node * tree_avl_find(struct _tree* self, void* obj) struct _tree_node * tree_avl_find(struct _tree* self, void* obj)
@ -1575,7 +1609,7 @@ bool tree_empty(struct _tree* self)
uint32_t tree_size(struct _tree* self) uint32_t tree_size(struct _tree* self)
{ {
assert(self != NULL); assert(self != NULL);
return self->size(self); return self->_size;
} }
// free // free
@ -1685,7 +1719,7 @@ void tree_avl_breadth(struct _tree* self, struct _tree_node* root)
assert(self != NULL); assert(self != NULL);
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, self->_obj_size); queue_init(queue, sizeof(struct _tree_node*));
if(node != NULL) if(node != NULL)
{ {
@ -1743,6 +1777,7 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size)
self->postorder = tree_avl_postorder; self->postorder = tree_avl_postorder;
self->breadth = tree_avl_breadth; self->breadth = tree_avl_breadth;
self->order = tree_order; self->order = tree_order;
self->find = tree_avl_find;
self->_root = NULL; self->_root = NULL;

View File

@ -279,8 +279,8 @@ void tree_test(void)
void test_tree_num(void) void test_tree_num(void)
{ {
uint32_t i = 0; uint32_t i = 0;
// int data[] = { 1,2,3,4,5,6,7,8,9,10 }; int data[] = { 1,2,3,4,5,6,7,8,9,10 };
int data[] = { 5,2,3,1,7,8,6 }; // int data[] = { 5,2,3,1,7,8,6 };
int temp = 0; int temp = 0;
uint32_t len = sizeof(data) / sizeof(data[0]); uint32_t len = sizeof(data) / sizeof(data[0]);
@ -331,6 +331,16 @@ void test_tree_num(void)
tree->breadth(tree, tree->_root); tree->breadth(tree, tree->_root);
printf("\n"); printf("\n");
while(!tree->empty(tree))
{
tree->delete(tree, &temp);
printf("pop = ");
tree->print_obj(&temp);
printf("size = %2d\n", tree->size(tree));
}
tree_free(tree); tree_free(tree);
} }