#ifndef BTREE_H
#define BTREE_H

/*! A type that defines a node in a binary tree */
typedef struct node {
  struct node * right;          /* right child */
  struct node * left;           /* left child */
  void * data;                  /* node data */
} Node;

/*! Operator function pointer */
typedef void(Op)(void *);

/*! Compare function pointer */
typedef int(Cmp)(void *, void *);

/*! \brief Allocates a new node and initialize it */
extern Node * create_node(void * data);

/*! \brief Inserts a given value into a tree pointed by root */
extern Node * insert(Node * root, void * data, Cmp * cmp);

/*! \brief Deallocates all memory allocated for the tree pointed by root */
extern void clean_tree(Node * root);

/* \brief Traverses the tree in left, middle, then right order */
extern void traverse_tree(Node * root, Op * op);

#endif
