mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +08:00
tree简化插入接口
This commit is contained in:
parent
bad8d68180
commit
d9d5f052b1
114
src/tree.c
114
src/tree.c
@ -405,11 +405,7 @@ struct _tree_node* tree_find_pos(struct _tree* self, void* obj)
|
|||||||
struct _tree_node* root = self->_root;
|
struct _tree_node* root = self->_root;
|
||||||
while (root != NULL)
|
while (root != NULL)
|
||||||
{
|
{
|
||||||
if (self->compare(obj, root->obj) == 0)
|
if (self->compare(obj, root->obj) < 0)
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (self->compare(obj, root->obj) < 0)
|
|
||||||
{
|
{
|
||||||
if (root->left == NULL)
|
if (root->left == NULL)
|
||||||
{
|
{
|
||||||
@ -417,7 +413,7 @@ struct _tree_node* tree_find_pos(struct _tree* self, void* obj)
|
|||||||
}
|
}
|
||||||
root = root->left;
|
root = root->left;
|
||||||
}
|
}
|
||||||
else
|
else if(self->compare(obj, root->obj) > 0)
|
||||||
{
|
{
|
||||||
if (root->right == NULL)
|
if (root->right == NULL)
|
||||||
{
|
{
|
||||||
@ -425,6 +421,11 @@ struct _tree_node* tree_find_pos(struct _tree* self, void* obj)
|
|||||||
}
|
}
|
||||||
root = root->right;
|
root = root->right;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if obj exist
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return root;
|
return root;
|
||||||
}
|
}
|
||||||
@ -436,40 +437,46 @@ static bool tree_avl_insert(struct _tree* self, void* obj)
|
|||||||
assert(obj != NULL);
|
assert(obj != NULL);
|
||||||
assert(self->compare != NULL);
|
assert(self->compare != NULL);
|
||||||
|
|
||||||
struct _tree_node* node = tree_node_new(self, obj);
|
if (self->_root == NULL)
|
||||||
if (node == NULL)
|
{
|
||||||
|
// if tree is empty
|
||||||
|
struct _tree_node* new_node = tree_node_new(self, obj);
|
||||||
|
if (new_node == NULL)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if no root
|
self->_root = new_node;
|
||||||
if (self->_root == NULL)
|
|
||||||
{
|
|
||||||
self->_root = node;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// insert the node
|
|
||||||
struct _tree_node* root = tree_find_pos(self, obj);
|
struct _tree_node* root = tree_find_pos(self, obj);
|
||||||
|
if (self->compare(obj, root->obj) == 0)
|
||||||
|
{
|
||||||
|
// if obj is exist in tree, return false
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct _tree_node* new_node = tree_node_new(self, obj);
|
||||||
|
if (new_node == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (self->compare(obj, root->obj) < 0)
|
if (self->compare(obj, root->obj) < 0)
|
||||||
{
|
{
|
||||||
root->left = node;
|
root->left = new_node;
|
||||||
node->parent = root;
|
new_node->parent = root;
|
||||||
}
|
}
|
||||||
else if (self->compare(obj, root->obj) > 0)
|
else /*if (self->compare(obj, root->obj) > 0)*/
|
||||||
{
|
{
|
||||||
root->right = node;
|
root->right = new_node;
|
||||||
node->parent = root;
|
new_node->parent = root;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// if obj exist, just return false
|
|
||||||
tree_node_free(&node);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self->_rebalance(self, root);
|
self->_rebalance(self, root);
|
||||||
}
|
}
|
||||||
|
|
||||||
self->_size++;
|
self->_size++;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -765,41 +772,46 @@ static bool tree_rb_insert(struct _tree* self, void* obj)
|
|||||||
assert(obj != NULL);
|
assert(obj != NULL);
|
||||||
assert(self->compare != NULL);
|
assert(self->compare != NULL);
|
||||||
|
|
||||||
struct _tree_node* node = tree_node_new(self, obj);
|
struct _tree_node* new_node = NULL;
|
||||||
if (node == NULL)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if no root
|
|
||||||
if (self->_root == NULL)
|
if (self->_root == NULL)
|
||||||
{
|
{
|
||||||
self->_root = node;
|
// if tree is empty
|
||||||
}
|
new_node = tree_node_new(self, obj);
|
||||||
else
|
if (new_node == NULL)
|
||||||
{
|
{
|
||||||
// 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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self->_root = new_node;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
struct _tree_node* root = tree_find_pos(self, obj);
|
||||||
|
if (self->compare(obj, root->obj) == 0)
|
||||||
|
{
|
||||||
|
// if obj is exist in tree, return false
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
self->_rebalance(self, node);
|
new_node = tree_node_new(self, obj);
|
||||||
|
if (new_node == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (self->compare(obj, root->obj) < 0)
|
||||||
|
{
|
||||||
|
root->left = new_node;
|
||||||
|
new_node->parent = root;
|
||||||
|
}
|
||||||
|
else /*if (self->compare(obj, root->obj) > 0)*/
|
||||||
|
{
|
||||||
|
root->right = new_node;
|
||||||
|
new_node->parent = root;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
self->_rebalance(self, new_node);
|
||||||
|
|
||||||
self->_size++;
|
self->_size++;
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
Reference in New Issue
Block a user