static void free_node_recursively(struct rbtree * tree, struct rbtree_node * node, rbtree_data_free_func free_func) { if(node->left != tree->nil) free_node_recursively(tree, node->left, free_func); if(node->right != tree->nil) free_node_recursively(tree, node->right, free_func); if(free_func) free_func(node->data); if(tree->free_key) tree->free_key(node->key); free(node); }
void rbtree_free(struct rbtree * tree, rbtree_data_free_func free_func) { if(tree->root != NULL && tree->root != tree->nil) free_node_recursively(tree, tree->root, free_func); free(tree->nil); free(tree); }