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, Iterator func, void *arg, TreeTraversionOrder order, int delete)
25 if (func && order == TRAVERSION_PREORDER ) func(node->dat, arg);
26 traverse(node->lft, func, arg, order, delete);
27 if (func && order == TRAVERSION_INORDER ) func(node->dat, arg);
28 traverse(node->rgt, func, arg, order, delete);
29 if (func && order == TRAVERSION_POSTORDER) func(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, Iterator func, void *arg, TreeTraversionOrder order)
73 traverse(tree->rot, func, arg, order, 0);
76 void tree_clr(Tree *tree, Iterator func, void *arg, TreeTraversionOrder order)
78 traverse(tree->rot, func, arg, order, 1);