From 26245288cc0b66618a94d9762054afeb5206cf0f Mon Sep 17 00:00:00 2001 From: jf-home Date: Sun, 23 Jun 2024 18:48:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=BF=98=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 39 +++++++++++++++++++++++++++++++++++++-- test/tree_test.c | 14 ++++++++++++-- 2 files changed, 49 insertions(+), 4 deletions(-) diff --git a/src/tree.c b/src/tree.c index bb23d5c..64470c7 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1535,7 +1535,41 @@ bool tree_avl_insert(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) @@ -1575,7 +1609,7 @@ bool tree_empty(struct _tree* self) uint32_t tree_size(struct _tree* self) { assert(self != NULL); - return self->size(self); + return self->_size; } // free @@ -1685,7 +1719,7 @@ void tree_avl_breadth(struct _tree* self, struct _tree_node* root) assert(self != NULL); struct _tree_node* node = self->_root; queue_t queue = queue_new(); - queue_init(queue, self->_obj_size); + queue_init(queue, sizeof(struct _tree_node*)); if(node != NULL) { @@ -1743,6 +1777,7 @@ bool tree_avl_init(struct _tree *self, uint32_t obj_size) self->postorder = tree_avl_postorder; self->breadth = tree_avl_breadth; self->order = tree_order; + self->find = tree_avl_find; self->_root = NULL; diff --git a/test/tree_test.c b/test/tree_test.c index a3b0b49..02abf9c 100644 --- a/test/tree_test.c +++ b/test/tree_test.c @@ -279,8 +279,8 @@ void tree_test(void) void test_tree_num(void) { uint32_t i = 0; - // int data[] = { 1,2,3,4,5,6,7,8,9,10 }; - int data[] = { 5,2,3,1,7,8,6 }; + int data[] = { 1,2,3,4,5,6,7,8,9,10 }; + // int data[] = { 5,2,3,1,7,8,6 }; int temp = 0; uint32_t len = sizeof(data) / sizeof(data[0]); @@ -331,6 +331,16 @@ void test_tree_num(void) tree->breadth(tree, tree->_root); 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); }