我正在尝试删除BST。根据算法,我们可以直接删除叶子。现在,我直接将NULL分配给叶子,并且该节点仍然保持原样。
在测试用例中,我尝试删除叶子,但它不起作用。
请帮助!
struct node * delet(long data, struct node* root)
{
int i=1;
struct node *temp = root,*t;
while(temp != 0)
{
if(data < temp->data)
{
i=2*i;
temp = temp->l;
}
else if(data > temp->data)
{
i = (2*i)+1;
temp = temp->r ;
}
else
{
printf("%d\n",i);
break;
}
}
if(temp->l == 0 && temp->r == 0)
{
temp = 0;
return root;
}
else if(temp->l == 0)
{
temp->data = temp->l->data;
temp->l = 0;
}
else if(temp->r == 0)
{
temp->data = temp->r->data;
temp->r = 0;
}
else
{
t = temp;
t = t->r;
while(t->l != 0)
{
t = t->l;
}
temp->data = t->data;
if(t->r != 0)
{
t->data = t->r->data;
t->r = 0;
return root;
}
else
{
t = 0;
return root;
}
}
}
答案 0 :(得分:2)
temp = 0;
不会从树中删除叶子,只是使局部变量为空。
您想使某个节点的l
或r
为空,以便从树中删除一个节点。
尝试保持父节点也好,一旦温度指向叶子,则使temp的父节点r
或l
无效。
稍后,t = 0;
也将继续使用。
请注意David's comment,有关首先释放此内存。
例如(假设不删除根):
...
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
情况也是一样。
那么你有
temp->l = 0;
但是您已经处于temp->l == 0
案中,所以我认为这不是您的意思。