From 63320bd01e6d13f35537627d29be64d620bde0f8 Mon Sep 17 00:00:00 2001 From: jf-home Date: Mon, 24 Jun 2024 00:54:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E7=9A=84bug=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E4=BA=86=E9=83=A8=E5=88=86=EF=BC=8C=E8=BF=98=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E7=82=B9=E5=B0=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 70 +++++++++++++++++++++++++++++++++++++++++------- test/tree_test.c | 4 +++ 2 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/tree.c b/src/tree.c index d249c7e..066d9d9 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1702,21 +1702,47 @@ static bool tree_avl_delete_single_child(struct _tree* self, struct _tree_node* if(node->parent == NULL) { - self->_root = node->left != NULL ? node->left : node->right; + if(node->left != NULL) + { + self->_root = node->left; + } + else if(node->right != NULL) + { + self->_root = node->right; + } } else { if(node->parent->left == node) { - node->left->parent = node->parent; - node->parent->left = node->left != NULL ? node->left : node->right; + if(node->left != NULL) + { + node->left->parent = node->parent; + node->parent->left = node->left; + } + else if(node->right != NULL) + { + node->right->parent = node->parent; + node->parent->left = node->right; + } } else if(node->parent->right == node) { - node->right->parent = node->parent; - node->parent->right = node->left != NULL ? node->left : node->right; + if(node->left != NULL) + { + node->left->parent = node->parent; + node->parent->right = node->left; + } + else if(node->right != NULL) + { + node->right->parent = node->parent; + node->parent->right = node->right; + } } + + self->rebalance(self, node->parent); } + tree_node_free(node); return true; } @@ -1725,7 +1751,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; } @@ -1755,12 +1781,30 @@ bool tree_avl_delete(struct _tree* self, void* obj) { tree_avl_delete_double_child(self, node); } - 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; + } + } + tree_node_free(node); + } - tree_node_free(node); self->_size--; return true; } @@ -1951,7 +1995,10 @@ void tree_avl_breadth(struct _tree* self, struct _tree_node* root) static struct _tree_node* tree_find_min(struct _tree* self, struct _tree_node* root) { assert(self != NULL); - assert(root != NULL); + if(root == NULL) + { + return NULL; + } if(root->left == NULL) { return root; @@ -1962,7 +2009,10 @@ 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) { assert(self != NULL); - assert(root != NULL); + if(root == NULL) + { + return NULL; + } if(root->right == NULL) { return root; diff --git a/test/tree_test.c b/test/tree_test.c index e17cc52..8328878 100644 --- a/test/tree_test.c +++ b/test/tree_test.c @@ -331,6 +331,10 @@ void test_tree_num(void) tree->breadth(tree, tree->_root); printf("\n"); + + + printf("----- left priority -----\n"); + tree->order(tree, false); for (i = 0; i < len; i++) { temp = data[i];