temp = 0;
не удаляет лист из дерева, просто обнуляет локальную переменную.
Вы хотите обнулить некоторые узлы l
или r
, чтобы удалить узел из дерева.
Попробуйте также сохранить родительский элемент, и, как только временная точка указывает на лист, обнулите родительский элемент temp r
или l
.
.
То же самое относится и к t = 0;
позже.
Примечание Комментарий Дэвида о первом освобождении этой памяти ..
Например (при условии, что рут не удаляется):
...
if(data < temp->data)
{
i=2*i;
parent = temp;
temp = temp->l;
}
else if(data > temp->data)
{
i = (2*i)+1;
parent = temp;
temp = temp->r ;
}
else
{
printf("%d\n",i);
break;
}
...
if(temp->l == 0 && temp->r == 0)
{
if (parent->l == temp)
parent->l = 0;
else
parent->r = 0;
// Free temp if needed
return root;
}
...
Также обратите внимание, что у вас есть:
else if(temp->l == 0)
{
temp->data = temp->l->data;
Это разыменование нулевого указателя (temp->l
равно NULL) и то же самое для temp->r == 0
case.
Тогда у вас есть
temp->l = 0;
но вы уже в temp->l == 0
деле, так что я не думаю, что это то, что вы имели в виду.