From d682bed186100121d7a21b8536c1da82429b7a9e Mon Sep 17 00:00:00 2001 From: jf-home Date: Fri, 25 Apr 2025 00:28:14 +0800 Subject: [PATCH] =?UTF-8?q?tree=E7=9A=84init=E5=87=BD=E6=95=B0=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/tree.h | 9 ---- src/tree.c | 111 +++++++++++++++++++++++++------------------------ 2 files changed, 57 insertions(+), 63 deletions(-) diff --git a/include/tree.h b/include/tree.h index ba8db9b..490c5fd 100644 --- a/include/tree.h +++ b/include/tree.h @@ -109,15 +109,6 @@ struct _tree void (*destory)(struct _tree* self); // -------------------- debug -------------------- - // traversal depth - void (*order)(struct _tree* self, bool right_priority); - - void (*preorder)(struct _tree* self, struct _tree_node* root); - void (*inorder)(struct _tree* self, struct _tree_node* root); - void (*postorder)(struct _tree* self, struct _tree_node* root); - // traversal breadth - void (*breadth)(struct _tree* self, struct _tree_node* root); - void (*print_obj)(void* obj); }; typedef struct _tree* tree_t; diff --git a/src/tree.c b/src/tree.c index 0ca8ced..b837c9c 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1744,6 +1744,7 @@ static bool tree_avl_init(struct _tree* self, uint32_t obj_size) { assert(self != NULL); + // -------------------- private -------------------- self->_obj_size = obj_size; self->_size = 0; // self->_capacity = 64; @@ -1752,48 +1753,47 @@ static bool tree_avl_init(struct _tree* self, uint32_t obj_size) self->_right_priority = false; self->_order = ORDER_PRE; - self->insert = tree_avl_insert; - self->delete = tree_avl_delete; - self->clear = tree_clear; - self->empty = tree_empty; - self->size = tree_size; - self->destory = tree_destory; - self->preorder = tree_preorder; - self->inorder = tree_inorder; - self->postorder = tree_postorder; - self->breadth = tree_breadth; - self->order = tree_order; - self->find = tree_find; - self->height = tree_height; - self->rebalance = tree_avl_rebalance; - self->find_max = tree_find_max; - self->find_min = tree_find_min; - self->max = tree_max; - self->min = tree_min; - self->_root = NULL; self->stack = stack_new(sizeof(struct _tree_node*)); if (self->stack == NULL) { - goto done; + return false; } self->queue = queue_new(sizeof(struct _tree_node*)); if (self->queue == NULL) { - goto done1; + stack_free(&self->stack); + return false; } self->cur_node = NULL; self->_iter.hasnext = tree_iter_hasnext; self->_iter.next = tree_iter_next; + + self->destory = tree_destory; + + // -------------------- public -------------------- + // kernel + self->insert = tree_avl_insert; + self->delete = tree_avl_delete; + self->rebalance = tree_avl_rebalance; + self->height = tree_height; + + // base + self->clear = tree_clear; + self->empty = tree_empty; + self->size = tree_size; + + // iter self->iter = tree_iter; - return true; -done1: - stack_free(&self->stack); -done: - return false; + // others + self->find = tree_find; + self->find_max = tree_find_max; + self->find_min = tree_find_min; + self->max = tree_max; + self->min = tree_min; return true; } @@ -1801,57 +1801,59 @@ done: static bool tree_rb_init(struct _tree* self, uint32_t obj_size) { assert(self != NULL); + + // -------------------- private -------------------- self->_obj_size = obj_size; self->_size = 0; // self->_capacity = 64; // self->_ratio = 2; + self->_root = NULL; + self->_right_priority = false; self->_order = ORDER_PRE; - self->insert = tree_rb_insert; - self->delete = tree_rb_delete; - self->rebalance = tree_rb_rebalance; - - self->clear = tree_clear; - self->empty = tree_empty; - self->size = tree_size; - self->destory = tree_destory; - self->preorder = tree_preorder; - self->inorder = tree_inorder; - self->postorder = tree_postorder; - self->breadth = tree_breadth; - self->order = tree_order; - self->find = tree_find; - self->height = tree_height; - self->find_max = tree_find_max; - self->find_min = tree_find_min; - self->max = tree_max; - self->min = tree_min; - - self->_root = NULL; - self->stack = stack_new(sizeof(struct _tree_node*)); if (self->stack == NULL) { - goto done; + return false; } self->queue = queue_new(sizeof(struct _tree_node*)); if (self->queue == NULL) { - goto done1; + stack_free(&self->stack); + return false; } self->cur_node = NULL; self->_iter.hasnext = tree_iter_hasnext; self->_iter.next = tree_iter_next; + + self->destory = tree_destory; + + // -------------------- public -------------------- + // kernel + self->insert = tree_rb_insert; + self->delete = tree_rb_delete; + self->rebalance = tree_rb_rebalance; + self->height = tree_height; + + // base + self->clear = tree_clear; + self->empty = tree_empty; + self->size = tree_size; + + // iter self->iter = tree_iter; + // others + self->find = tree_find; + self->find_max = tree_find_max; + self->find_min = tree_find_min; + self->max = tree_max; + self->min = tree_min; + return true; -done1: - stack_free(&self->stack); -done: - return false; } tree_t tree_avl_new(uint32_t obj_size) @@ -1870,6 +1872,7 @@ tree_t tree_avl_new(uint32_t obj_size) } return tree; } + tree_t tree_rb_new(uint32_t obj_size) { tree_t tree = NULL;