#ifndef BST_H_ #define BST_H_ /* Binary search tree that uses a word as the key value and includes a count as well. */ // HW42 - items that you need to complete or use for // HW42 are noted as such in the files (do a search for HW42 to find them) typedef struct tree { void * data; int data_size; struct tree *left, *right, *parent; // HW42 - should be a pointer to a node's parent, or NULL if the node is the root int max_height; // HW42 - should be the max height of this node's children, 0 for a leaf node int (*compare)(void *, int, void *, int); // comparison function for this data type void (*print)(void *, int, int); // function for printing void (*free)(void *, int); // function for freeing data } tree_t; // if data is not in the tree, insert it. // return the root of the tree (which is created if the tree is empty) // // HW42 // FLAG_ALLOW_DUPLICATES - allow for duplicate keys (adding to left if ==) // FLAG_DO_NOT_REBALANCE - do not rotate/rebalance #define FLAG_ALLOW_DUPLICATES 0x10 #define FLAG_DO_NOT_REBALANCE 0x20 tree_t *bst_insert(tree_t *root, void *data, int data_size, unsigned int flags, int (*compare)(void *, int, void *, int), void (*print)(void *, int, int), void (*free)(void *, int)); // if data is in the tree, return a pointer to the tree_t node tree_t *bst_lookup(tree_t *root, void *data, int data_size); // remove p from the tree tree_t *bst_delete(tree_t *root, tree_t *p, unsigned int flags); // print the tree. // // HW42 - modify bst_print so it uses these parameters // limit - don't print more than this many (if -1 print them all) // flags - // FLAG_SMALLEST_FIRST - print smallest ones first, otherwise largest ones first // FLAG_SUMMARY - print summary info - # nodes, max depth, average depth. // FLAG_TREE - make printout look like a tree (by using spaces for depth) // FLAG_DEBUG - along with printing the data, for each node print it's pointer, parent pointer, and max_height #define FLAG_SMALLEST_FIRST 0x01 #define FLAG_SUMMARY 0x02 #define FLAG_TREE 0x04 #define FLAG_DEBUG 0x08 void bst_print(tree_t *root, int limit, unsigned int flags); // HW42 // // When this function is called, it will take the second parameter // as a function and traverse the tree with the function getting // called for each node of the tree, and with that function getting the // param as its second parameter void bst_map(tree_t *root, void (*fun)(tree_t *, void *), void *param); #endif