Это комментарий, а не реальный ответ, поскольку он касается другой проблемы, чем вы спрашиваете. Однако он слишком длинный для места для комментариев, поэтому я размещаю его здесь.
Я полагаю, вы ошибочно ссылаетесь на root
в этой части
while (t)
{
p = t;
if (val > root->data)
t = root->right;
else
t = root->left;
}
ИМХО это должно выглядеть так это:
while (t)
{
p = t;
if (val > t->data)
t = t->right;
else
t = t->left;
}
Также сравните код для поиска места для вставки с кодом, который выполняет фактическую вставку:
if (p->data > t->data)
p->left = t;
else
p->right = t;
Вы поместили подвыражения сравнения в обратном порядке - при поиске вы проверяете, больше ли новое значение, чем в существующем узле, но при вставке вы проверяете, больше ли существующее значение, чем новое. Если они отличаются, код будет работать нормально, потому что вы также поменяли местами left
и right
в ветвях then и else.
Однако, если значения кажутся равными, контроль выполнения будет go в "else" в обоих местах. В результате код тестирования может остановиться на пустом указателе left
, но тогда к right
будет добавлен новый узел, который не был протестирован на предмет NULL
.