From 82c5a881e7a918cdef11f3a681da5f7db8a9629e Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Tue, 25 Jun 2024 13:05:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Eclear=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=B9=B6=E5=88=A0=E9=99=A4=E9=9D=9E=E5=BF=85=E8=A6=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 96 +++++++++++++++++++++--------------------------- test/test_tree.c | 14 +++++++ 2 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/tree.c b/src/tree.c index c7b4664..e3857e1 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1763,25 +1763,7 @@ bool tree_avl_insert(struct _tree* self, void* obj) return false; } - // printf("--------------------\n"); - // printf("insert : \n"); - // self->print_obj(node->obj); - // printf("\n"); - - // printf("all data : \n"); - // self->preorder(self, self->_root); - // printf("\n"); - self->rebalance(self, root); - - // printf("parent_path: \n"); - // struct _tree_node * tmp = node; - // do - // { - // self->print_obj(tmp->obj); - // tmp = tmp->parent; - // }while(tmp != NULL); - // printf("\n"); } self->_size++; return true; @@ -1798,17 +1780,11 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { node->left->parent = node->parent; // step1 : NULL for root self->_root = node->left; // step2 - - // options - // node->left = NULL; } else if(node->right != NULL) { node->right->parent = node->parent; // step1 : NULL for root self->_root = node->right; // step2 - - // options - // node->right = NULL; } else { @@ -1823,28 +1799,15 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { node->left->parent = node->parent; // step1 node->parent->left = node->left; // step2 - - // node->left->right = node->right; // step3 : NULL for singly child - // // options - // node->left = NULL; - // node->parent = NULL; } else if(node->right != NULL) { node->right->parent = node->parent; // step1 node->parent->left = node->right; // step2 - - // node->right->left = node->left; // step3 : NULL for singly child - // // options - // node->right = NULL; - // node->parent = NULL; } else { node->parent->left = NULL; - - // options - // node->parent = NULL; } } else if(node->parent->right == node) @@ -1853,28 +1816,15 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { node->left->parent = node->parent; // step1 node->parent->right = node->left; // step2 - - // node->left->right = node->right; // step3 : NULL for singly child - // // options - // node->left = NULL; - // node->parent = NULL; } else if(node->right != NULL) { node->right->parent = node->parent; // step1 node->parent->right = node->right; // step2 - - // node->right->left = node->left; // step3 : NULL for singly child - // // options - // node->right = NULL; - // node->parent = NULL; } else { node->parent->right = NULL; - - // options - // node->parent = NULL; } } @@ -1892,11 +1842,6 @@ static bool tree_avl_delete_double_child(struct _tree* self, struct _tree_node* if(tmp != NULL) { memmove(node->obj, tmp->obj, self->_obj_size); - // if(tmp->right != NULL) - // { - // node->right = tmp->right; - // tmp->right->parent = node; - // } tree_avl_delete_single_child(self, tmp); } return true; @@ -1959,6 +1904,32 @@ struct _tree_node * tree_avl_find(struct _tree* self, void* obj) bool tree_clear(struct _tree* self) { assert(self != NULL); + if(self->_root == NULL) + { + return false; + } + + struct _tree_node* node = self->_root; + queue_t queue = queue_new(); + queue_init(queue, sizeof(struct _tree_node*)); + + queue->push(queue, &node); + while(!queue->empty(queue)) + { + queue->pop(queue, &node); + if(node->left != NULL) + { + queue->push(queue, &node->left); + } + if(node->right != NULL) + { + queue->push(queue, &node->right); + } + tree_node_free(node); + } + queue_free(queue); + self->_root = NULL; + self->_size = 0; return true; } @@ -2331,6 +2302,7 @@ static struct _tree_node* tree_find_min(struct _tree* self, struct _tree_node* r static struct _tree_node* tree_find_max(struct _tree* self, struct _tree_node* root) { +#if 0 assert(self != NULL); if(root == NULL) { @@ -2341,6 +2313,20 @@ static struct _tree_node* tree_find_max(struct _tree* self, struct _tree_node* r return root; } return tree_find_max(self, root->right); +#else + while(root != NULL) + { + if(root->right != NULL) + { + root = root->right; + } + else + { + return root; + } + } + return root; +#endif } bool tree_avl_init(struct _tree *self, uint32_t obj_size) diff --git a/test/test_tree.c b/test/test_tree.c index 090723c..c5b7401 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -305,6 +305,20 @@ void test_tree_num(void) tree->preorder(tree, tree->_root); printf("\n"); } + + printf("----- tree -----\n"); + tree->clear(tree); + if(tree->empty(tree)) + { + printf("----- empty -----\n"); + } + printf("----- insert -----\n"); + for (i = 0; i < len; i++) + { + temp = data[i]; + tree->insert(tree, &temp); + } + printf("----- preorder -----\n"); tree->preorder(tree, tree->_root); printf("\n");