То, что на самом деле происходило, могло заключаться в том, что поиски могли быть обращены вспять, так что на самом деле они просто продолжали бы работать правильно, но данные не были действительно правильно сопоставлены, и, таким образом, это могло бы повредить стену.
if (root->data < x)
remove(root->left, x);
else
remove(root->right, x);
должно было быть
if(x < root->data)
remove(root->left, x);
else
remove(root->right, x);