diff --git a/CMakelists.txt b/CMakelists.txt index c952eb2..92ac971 100644 --- a/CMakelists.txt +++ b/CMakelists.txt @@ -1,6 +1,6 @@ # 0. cmake 最低版本号要求 -cmake_minimum_required(VERSION 3.28) +cmake_minimum_required(VERSION 3.27) # 0. 项目信息 project(demo) diff --git a/src/tree.c b/src/tree.c index 3b1cadd..85f1342 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1717,12 +1717,18 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* { if(node->left != NULL) { + node->left->parent = NULL; self->_root = node->left; } else if(node->right != NULL) { + node->right->parent = NULL; self->_root = node->right; } + else + { + self->_root = NULL; + } } else { @@ -1772,7 +1778,7 @@ static bool tree_avl_delete_double_child(struct _tree* self, struct _tree_node* assert(self != NULL); assert(node != NULL); struct _tree_node* tmp = self->find_min(self, node->right); - if(tmp != NULL) + if(tmp == NULL) { return false; } @@ -1802,31 +1808,32 @@ bool tree_avl_delete(struct _tree* self, void* obj) { 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); } - else - { - if(node->parent == NULL) - { - self->_root = NULL; - } - else - { - if(node->parent->left == node) - { - node->parent->left = NULL; - } - else if(node->parent->right == node) - { - node->parent->right = NULL; - } + // else + // { + // if(node->parent == NULL) + // { + // self->_root = NULL; + // } + // else + // { + // if(node->parent->left == node) + // { + // node->parent->left = NULL; + // } + // else if(node->parent->right == node) + // { + // node->parent->right = NULL; + // } - self->rebalance(self, node->parent); - } - tree_node_free(node); - } + // self->rebalance(self, node->parent); + // } + // tree_node_free(node); + // } self->_size--; 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) { assert(self != NULL); + if(root == NULL) + { + return; + } + if(!self->_right_priority) { 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) { assert(self != NULL); + if(root == NULL) + { + return; + } + if(!self->_right_priority) { 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) { assert(self != NULL); + if(root == NULL) + { + return; + } + if(!self->_right_priority) { 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) { assert(self != NULL); + if(root == NULL) + { + return; + } + struct _tree_node* node = self->_root; queue_t queue = queue_new(); queue_init(queue, sizeof(struct _tree_node*)); diff --git a/test/tree_test.c b/test/test_tree.c similarity index 96% rename from test/tree_test.c rename to test/test_tree.c index 27f772c..2fc1c55 100644 --- a/test/tree_test.c +++ b/test/test_tree.c @@ -279,8 +279,10 @@ void tree_test(void) void test_tree_num(void) { uint32_t i = 0; + // int data[] = { 2,1,3,4}; // 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,4,9,10,12,11,15,14,13 }; int temp = 0; uint32_t len = sizeof(data) / sizeof(data[0]); @@ -335,6 +337,10 @@ void test_tree_num(void) printf("----- left priority -----\n"); tree->order(tree, false); + printf("----- breadth -----\n"); + tree->breadth(tree, tree->_root); + printf("\n"); + for (i = 0; i < len; i++) { temp = data[i]; @@ -347,6 +353,8 @@ void test_tree_num(void) printf("----- breadth -----\n"); tree->breadth(tree, tree->_root); + printf("----- inorder -----\n"); + tree->inorder(tree, tree->_root); printf("\n"); }