1 #include <stdlib.h> // for malloc, free
2 #include "bits/wrappers.h"
5 static inline TreeNode **search(TreeNode **node, void *key, Comparator cmp)
10 int rel = cmp((*node)->dat, key);
15 return search(&(*node)->lft, key, cmp);
17 return search(&(*node)->rgt, key, cmp);
20 static inline void traverse(TreeNode *node, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order, int delete)
25 if (iter && order == TRAVERSION_PREORDER ) iter(trans ? trans(node->dat) : node->dat, arg);
26 traverse(node->lft, iter, arg, trans, order, delete);
27 if (iter && order == TRAVERSION_INORDER ) iter(trans ? trans(node->dat) : node->dat, arg);
28 traverse(node->rgt, iter, arg, trans, order, delete);
29 if (iter && order == TRAVERSION_POSTORDER) iter(trans ? trans(node->dat) : node->dat, arg);
35 void tree_ini(Tree *tree)
40 WRAP_NODE_FUNCTIONS(Tree, tree_)
42 TreeNode **tree_nfd(Tree *tree, void *key, Comparator cmp)
44 return search(&tree->rot, key, cmp);
47 void tree_nmk(__attribute__((unused)) Tree *tree, TreeNode **node, void *dat)
49 *node = malloc(sizeof **node);
51 (*node)->lft = (*node)->rgt = NULL;
54 void tree_nrm(__attribute__((unused)) Tree *tree, TreeNode **node)
56 TreeNode *old = *node;
60 TreeNode **rgt = node;
71 void tree_trv(Tree *tree, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order)
73 traverse(tree->rot, iter, arg, trans, order, 0);
76 void tree_clr(Tree *tree, Callback iter, void *arg, Transformer trans, TreeTraversionOrder order)
78 traverse(tree->rot, iter, arg, trans, order, 1);