Проблема не в бесконечном цикле. Вы разыменовываете нулевой указатель, поэтому программа вылетает.
В этом коде:
void add(int n, elem * &t) {
if (t) {
t = new elem;
t->key = n;
t->left = t->right = NULL;
}
else {
if (t->key < n)
add(n, t->right);
else
add(n, t->left);
}
}
Ваше условие для добавления узла неверно. Это должно быть if (!t)
. Местоположение нового узла в бинарном дереве поиска должно быть дочерним по отношению к узлу с хотя бы одним нулевым дочерним указателем. Чтобы добавить узел, вам нужна рекурсия, чтобы добраться до одного из этих нулевых указателей, а затем добавить туда узел.
Подумайте о том, что происходит, когда вы передаете изначально нулевой корень функции add
. Условие в первом операторе if
является ложным, поэтому при попытке проверить условие if (t->key < n)
вы пытаетесь получить доступ к полю key
несуществующего объекта.