From 59e5c9be7120d88e10bd90f1c72d11fab9e346ff Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Sun, 27 Apr 2025 11:05:12 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=A0=91=E9=AB=98=E7=9A=84?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E9=87=8D=E6=96=B0=E5=AE=9A=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/tree.h | 4 +- src/tree.c | 113 ++++++++++++++++++++++++++----------------------- 2 files changed, 61 insertions(+), 56 deletions(-) diff --git a/include/tree.h b/include/tree.h index c0f1c52..5517ff2 100644 --- a/include/tree.h +++ b/include/tree.h @@ -79,14 +79,14 @@ struct _tree struct _iterator _iter; + bool (*rebalance)(struct _tree* self, struct _tree_node* root); void (*_destory)(struct _tree* self); // -------------------- public -------------------- // kernel bool (*insert)(struct _tree* self, void* obj); bool (*delete)(struct _tree* self, void* obj); - bool (*rebalance)(struct _tree* self, struct _tree_node* root); - int32_t (*height)(struct _tree* self, struct _tree_node* root); + uint32_t (*height)(struct _tree* self); // base bool (*clear)(struct _tree* self); diff --git a/src/tree.c b/src/tree.c index a1f0431..5fb8318 100644 --- a/src/tree.c +++ b/src/tree.c @@ -12,6 +12,60 @@ #include "queue.h" #include "stack.h" + +static uint32_t tree_height_node(struct _tree* self, struct _tree_node* root) +{ +#if 0 + assert(self != NULL); + if (root == NULL) + { + return 0; + } + uint32_t left_height = tree_height_node(self, root->left); + uint32_t right_height = tree_height_node(self, root->right); + return (left_height > right_height) ? (left_height + 1) : (right_height + 1); +#else + assert(self != NULL); + if (root == NULL) + { + return 0; + } + uint32_t height = 0; + int32_t count_cur_level = 0; + int32_t count_next_level = 0; + + struct _tree_node* node = root; + queue_t queue = queue_new(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); + } + + if (count_cur_level == count_next_level) + { + count_next_level = queue->size(queue); + height++; + count_cur_level = 1; + } + else + { + count_cur_level++; + } + } + queue_free(&queue); + return height; +#endif +} + static void tree_set_balance(struct _tree* self, struct _tree_node* node) { assert(self != NULL); @@ -19,7 +73,7 @@ static void tree_set_balance(struct _tree* self, struct _tree_node* node) { return; } - node->balance = self->height(self, node->right) - self->height(self, node->left); + node->balance = (int32_t)(tree_height_node(self, node->right) - tree_height_node(self, node->left)); } static struct _tree_node* tree_turn_left(struct _tree* self, struct _tree_node* root) @@ -128,59 +182,6 @@ static struct _tree_node* tree_turn_right_then_left(struct _tree* self, struct _ return node; } -static int32_t tree_height(struct _tree* self, struct _tree_node* root) -{ -#if 0 - assert(self != NULL); - if (root == NULL) - { - return 0; - } - int32_t left_height = tree_height(self, root->left); - int32_t right_height = tree_height(self, root->right); - return (left_height > right_height) ? (left_height + 1) : (right_height + 1); -#else - assert(self != NULL); - if (root == NULL) - { - return 0; - } - int32_t height = 0; - int32_t count_cur_level = 0; - int32_t count_next_level = 0; - - struct _tree_node* node = root; - queue_t queue = queue_new(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); - } - - if (count_cur_level == count_next_level) - { - count_next_level = queue->size(queue); - height++; - count_cur_level = 1; - } - else - { - count_cur_level++; - } - } - queue_free(&queue); - return height; -#endif -} - /** * @brief * @@ -1432,6 +1433,10 @@ static const void* tree_iter_next(struct _iterator* iter) return obj; } +static uint32_t tree_height(struct _tree* self) +{ + return tree_height_node(self, self->_root); +} static bool tree_avl_init(struct _tree* self, uint32_t obj_size) {