bool insert(TreeNode tree, TreeNode node, int (*comp)(void*, void*)){
if(tree == NULL){
tree = node;
return true;
}
Проблема (или, по крайней мере, a проблема) прямо здесь: вы передаете tree
в качестве указателя на триод, затем вы назначаете node
этому указателю - но вы Вы назначаете только локальную копию указателя, которая не влияет на указатель вне этой функции. Чтобы чего-то добиться, вам нужно что-то вроде:
bool insert(TreeNode *tree, TreeNode node, int (*comp)(void *, void *)) {
if (*tree == NULL) {
*tree = node;
return true;
}
// ....
Таким образом, вы меняете указатель, адрес которого был передан в функцию.
В качестве альтернативы, вы можете рассмотреть вопрос о том, чтобы всегда помещать отдельный узел в дерево сразу после создания, поэтому вы всегда работаете только с дочерними элементами корневого узла и никогда не сталкиваетесь с (несколько) особенным случаем вставки корневого узла сам по себе.