An implementation of Dictionary ADT using AVL Tree and Binary Search Tree data structures. It comes with all necessary search tree algorithms, designed carefully for code reuse & performance.
The only check in bst_destroy() function in the bst_init_destroy.c file is whether fpDestroyKey and fpDestroyData are set. But in the leafs of the tree (external nodes in the terms you use) you store NULL values. So the destructor functions are called for NULL values too.
In the example programs you use destruction functions that are doing nothing for NULL values. But it isn't a common convention and (if you want to keep that behavior) it must be covered by library documentation, IMO.
The alternative way is to check for NULL values in the bst_destroy() itself.