};
}
-static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key)
+static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key, bool return_existing)
{
if (*nodeptr) {
int cond;
- if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0)
+ if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0 && return_existing)
return nodeptr;
else if (cond > 0)
- return search_recursive(tree, &(*nodeptr)->left, key);
+ return search_recursive(tree, &(*nodeptr)->left, key, return_existing);
else
- return search_recursive(tree, &(*nodeptr)->right, key);
+ return search_recursive(tree, &(*nodeptr)->right, key, return_existing);
} else {
return nodeptr;
}
BintreeNode **bintree_search(Bintree *tree, void *key)
{
- return search_recursive(tree, &tree->root, key);
+ return search_recursive(tree, &tree->root, key, true);
}
void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value)
(*nodeptr)->left = (*nodeptr)->right = NULL;
}
+void bintree_insert(Bintree *tree, void *key, void *value)
+{
+ bintree_add_node(tree, search_recursive(tree, &tree->root, key, false), key, value);
+}
+
static void bintree_free(BintreeNode *node, void *arg)
{
BintreeFreeData *fdata = arg;
Bintree bintree_create(size_t key_size, BintreeComparator cmp);
BintreeNode **bintree_search(Bintree *tree, void *key);
void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value);
+void bintree_insert(Bintree *tree, void *key, void *value);
void bintree_traverse(Bintree *tree, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg);
void bintree_clear(Bintree *tree, BintreeTraversionFunction func, void *arg);