Вы назначаете значения в слишком многих местах.
return node->left = insert(node->left, data);
// ...
return node->right = insert(node->right, data);
Эти строки возвращают значение и присваивают - на каждом уровне стека рекурсии.
Вы не должны назначать повторно во время повторения. В противном случае вы разрушите дерево, которое вы проходите, заменив каждый узел в обходе узлом конечного результата.
При таком структурированном коде (с рекурсией влево / вправо + возврат) единственное место, где вы должны выполнить назначение, это:
if(node == NULL)
{
// assign here...
}
Однако, если вы сделаете это, вам придется взять указатель на указатель.