当我试图从我的自平衡树中删除一个节点(如只有插入操作时,没有泄漏)时,我特别遇到了内存泄漏。在我的删除和插入操作完成后,我调用了一个函数来销毁树,但仍然存在内存泄漏。该函数本身似乎工作正常(我打印了一个树的前序遍历,它是正确的)。这是我的删除功能的样子:
node * Delete(node *T,int x)
{
node *p;
if(T==NULL)
{
return NULL;
}
else
if(x > T->data) // insert in right subtree
{
T->right=Delete(T->right,x);
if(BF(T)==2)
if(BF(T->left)>=0)
T=LL(T);
else
T=LR(T);
}
else
if(x<T->data)
{
T->left=Delete(T->left,x);
if(BF(T)==-2) //Rebalance during windup
if(BF(T->right)<=0)
T=RR(T);
else
T=RL(T);
}
else
{
//data to be deleted is found
if(T->right!=NULL)
{ //delete its inorder succesor
p=T->right;
while(p->left!= NULL)
p=p->left;
T->data=p->data;
T->right=Delete(T->right,p->data);
if(BF(T)==2)//Rebalance during windup
if(BF(T->left)>=0)
T=LL(T);
else
T=LR(T);\
}
else
return(T->left);
}
T->ht=height(T);
return(T);
}
还有我的销毁/免费功能:
void destroytree (node* root)
{
if (root == NULL)
{
return;
}
destroytree(root->left);
destroytree(root->right);
printf("%d\n",root->key); // just to see what is happening.
free(root)
return;
}
我不知道如何释放要删除的节点的内存。这就是内存泄漏的原因——当我打印正在释放的根(在destroytree中)时,总是丢失已删除的节点,因此我认为这就是内存泄漏的地方。我唯一的问题是,使用我编写的 deletenode 函数,我不知道在哪里释放这些内存。我将不胜感激任何帮助。另外,当我插入节点时,我当然会在我的插入节点中进行 malloc。