1 #include <stdlib.h> // for malloc, free
2 #include "bits/callback.h" // for Callback, Comparator, Transformer
3 #include "bits/wrappers.h"
6 static inline TreeNode **search(TreeNode **node, void *key, Comparator cmp)
11 int rel = cmp((*node)->dat, key);
16 return search(&(*node)->lft, key, cmp);
18 return search(&(*node)->rgt, key, cmp);
21 static inline void traverse(TreeNode *node, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order, int delete)
26 if (iter && order == TRAVERSION_PREORDER ) iter(trans ? trans(node->dat) : node->dat, arg);
27 traverse(node->lft, iter, arg, trans, order, delete);
28 if (iter && order == TRAVERSION_INORDER ) iter(trans ? trans(node->dat) : node->dat, arg);
29 traverse(node->rgt, iter, arg, trans, order, delete);
30 if (iter && order == TRAVERSION_POSTORDER) iter(trans ? trans(node->dat) : node->dat, arg);
36 void tree_ini(Tree *tree)
41 WRAP_NODE_FUNCTIONS(Tree, tree_)
43 TreeNode **tree_nfd(Tree *tree, void *key, void *cmp)
45 return search(&tree->rot, key, cmp);
48 void tree_nmk(__attribute__((unused)) Tree *tree, TreeNode **node, void *dat)
50 *node = malloc(sizeof **node);
52 (*node)->lft = (*node)->rgt = NULL;
55 void tree_nrm(__attribute__((unused)) Tree *tree, TreeNode **node)
57 TreeNode *old = *node;
61 TreeNode **rgt = node;
72 void tree_trv(Tree *tree, void *iter, void *arg, void *trans, TreeTraversionOrder order)
74 traverse(tree->rot, iter, arg, trans, order, 0);
77 void tree_clr(Tree *tree, void *iter, void *arg, void *trans, TreeTraversionOrder order)
79 traverse(tree->rot, iter, arg, trans, order, 1);