From 202832f29cc56dff3210f28e3361cc185e96ffae Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Mon, 24 Jun 2024 10:15:54 +0800 Subject: [PATCH] =?UTF-8?q?balance=3D0=E6=97=B6=E4=B8=8D=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E6=97=8B=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/tree.h | 4 ++-- src/tree.c | 32 ++++++++------------------------ test/test_tree.c | 4 ++-- 3 files changed, 12 insertions(+), 28 deletions(-) diff --git a/include/tree.h b/include/tree.h index 9d213b6..9b823d3 100644 --- a/include/tree.h +++ b/include/tree.h @@ -83,7 +83,7 @@ struct _tree_node union { - uint32_t balance; + int32_t balance; uint32_t color; }; }; @@ -108,7 +108,7 @@ struct _tree struct _tree_node* (*find_max)(struct _tree* self, struct _tree_node* root); bool (*rebalance)(struct _tree* self, struct _tree_node* root); - uint32_t (*height)(struct _tree* self, struct _tree_node* root); + int32_t (*height)(struct _tree* self, struct _tree_node* root); bool (*min)(struct _tree* self, void** obj); bool (*max)(struct _tree* self, void** obj); diff --git a/src/tree.c b/src/tree.c index 85f1342..01aa2a2 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1502,7 +1502,7 @@ static struct _tree_node* tree_trun_right_then_left(struct _tree* self, struct _ return node; } -uint32_t tree_height(struct _tree* self, struct _tree_node* root) +int32_t tree_height(struct _tree* self, struct _tree_node* root) { assert(self != NULL); if(root == NULL) @@ -1544,7 +1544,11 @@ static bool tree_avl_rebalance(struct _tree* self, struct _tree_node* root) tree_set_balance(self, root); int balance = root->balance; - if(balance > 1) + if(balance == 0) + { + // no need to rebalance + } + else if(balance > 1) { if(root->right->balance > 0) { @@ -1806,34 +1810,14 @@ bool tree_avl_delete(struct _tree* self, void* obj) if(node->left != NULL && node->right != NULL) { + // have two child tree_avl_delete_double_child(self, node); } else - // else if(node->left != NULL || node->right != NULL) { + // have singule child or no child 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; - // } - - // self->rebalance(self, node->parent); - // } - // tree_node_free(node); - // } self->_size--; return true; diff --git a/test/test_tree.c b/test/test_tree.c index 2fc1c55..6af1fbb 100644 --- a/test/test_tree.c +++ b/test/test_tree.c @@ -344,13 +344,13 @@ void test_tree_num(void) for (i = 0; i < len; i++) { temp = data[i]; - tree->delete(tree, &temp); printf("delete = "); tree->print_obj(&temp); - printf("size = %2d\n", tree->size(tree)); + tree->delete(tree, &temp); + printf("----- breadth -----\n"); tree->breadth(tree, tree->_root); printf("----- inorder -----\n");