7 BintreeTraversionFunction func;
11 static int bintree_compare_mem(void *v1, void *v2, Bintree *tree)
13 return memcmp(v1, v2, tree->key_size);
16 Bintree bintree_create(size_t key_size, BintreeComparator cmp)
21 .cmp = cmp ? cmp : &bintree_compare_mem,
25 static BintreeNode **search_recursive(Bintree *tree, BintreeNode **nodeptr, void *key)
30 if ((cond = tree->cmp((*nodeptr)->key, key, tree)) == 0)
33 return search_recursive(tree, &(*nodeptr)->left, key);
35 return search_recursive(tree, &(*nodeptr)->right, key);
41 BintreeNode **bintree_search(Bintree *tree, void *key)
43 return search_recursive(tree, &tree->root, key);
46 void bintree_add_node(Bintree *tree, BintreeNode **nodeptr, void *key, void *value)
48 *nodeptr = malloc(sizeof(BintreeNode));
49 (*nodeptr)->key = malloc(tree->key_size);
50 memcpy((*nodeptr)->key, key, tree->key_size);
51 (*nodeptr)->value = value;
52 (*nodeptr)->left = (*nodeptr)->right = NULL;
55 static void bintree_free(BintreeNode *node, void *arg)
57 BintreeFreeData *fdata = arg;
60 fdata->func(node, fdata->arg);
66 void bintree_clear(Bintree *tree, BintreeTraversionFunction func, void *arg)
69 BintreeFreeData fdata = {
74 bintree_traverse(tree, BTT_POSTORDER, &bintree_free, &fdata);
79 static void traverse_recursive(BintreeNode *node, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg)
82 if (traversion == BTT_PREORDER)
85 traverse_recursive(node->left, traversion, func, arg);
87 if (traversion == BTT_INORDER)
90 traverse_recursive(node->right, traversion, func, arg);
92 if (traversion == BTT_POSTORDER)
97 void bintree_traverse(Bintree *tree, BintreeTraversion traversion, BintreeTraversionFunction func, void *arg)
99 traverse_recursive(tree->root, traversion, func, arg);