From 571b28fb4f574c89805ffa4ca51b6db035c37f43 Mon Sep 17 00:00:00 2001 From: wjf-hs Date: Fri, 28 Jun 2024 16:50:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=B8=8B=E7=BA=A2?= =?UTF-8?q?=E9=BB=91=E6=A0=91=E6=8F=92=E5=85=A5=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tree.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 48 insertions(+), 1 deletion(-) diff --git a/src/tree.c b/src/tree.c index 72afaba..9f049e0 100644 --- a/src/tree.c +++ b/src/tree.c @@ -1061,6 +1061,53 @@ bool tree_set_color(struct _tree_node* node, rbt_color color) return true; } + +bool tree_rb_insert(struct _tree* self, void* obj) +{ + assert(self != NULL); + assert(obj != NULL); + assert(self->compare != NULL); + + struct _tree_node* node = tree_node_new(self, obj); + if(node == NULL) + { + return false; + } + + // if no root + if(self->_root == NULL) + { + self->_root = node; + } + else + { + // insert the node + struct _tree_node* root = tree_find_pos(self, obj); + if(self->compare(obj, root->obj) < 0) + { + root->left = node; + node->parent = root; + } + else if(self->compare(obj, root->obj) > 0) + { + root->right = node; + node->parent = root; + } + else + { + // if obj exist, just return false + tree_node_free(node); + return false; + } + + } + + self->rebalance(self, node); + + self->_size++; + return true; +} + /** * @brief * @@ -1380,7 +1427,7 @@ bool tree_rb_init(struct _tree *self, uint32_t obj_size) self->_right_priority = false; - self->insert = tree_avl_insert; + self->insert = tree_rb_insert; self->delete = tree_rb_delete; self->clear = tree_clear; self->empty = tree_empty;