在BST中删除

时间:2015-02-18 11:25:58

标签: c pointers binary-search-tree double-pointer

删除是在函数内部进行的,但在从函数返回后没有反映在head中。我正在使用双指针,所以我认为它应该。

代码

void delete(node **head,int key)
{
    int x;
    node *p=*head,*q=*head;
    while(p->data!=key)
    {
        q=p; //q will have the address of parent
        if(p->data>key)
            p=p->left;
        else
            p=p->right;
    }   
    if(p->left==NULL && p->right==NULL) //leaf
    {   
        p=NULL;
        return ;
    }
    if(p->left==NULL)
    {
        if(q->left&&q->left==p) //Check if the node to be deleted is a left/right child of parent
        {
            q->left=p->right;
            free(p);
            return;
        }
        if(q->right&&q->right==p)
        {
            q->right=p->right;
            free(p);
            return;
        }

    }
    if(p->left!=NULL && p->right!=NULL)
    {
        q=giveAddress(*head,inorderSuccessor(*head,key));   //give address find the address of the inorder successor
        p->data=q->data;
        free(q);
    }   




}

函数调用:delete(& head,key);

注意:我不明白的一件事是,如果我改变上述函数的叶子部分内的条件,它适用于叶子。

if(p->left==NULL && p->right==NULL) //leaf
    {   
        if(q->left&&q->left==p) //Check if the node to be deleted is a left/right child of parent
        {
            q->left=NULL;
            free(p);
            return;
        }
        if(q->right&&q->right==p)
        {
            q->right=NULL;
            free(p);
            return;
        }

    }

没关系,因为我们将父指针(左,右)设为NULL。所以它会删除节点。它不会释放内存位置,对吗?

如果我错了,请纠正我

因此,如果我们执行p=Null,它会为p和parent分配空值 - > left仍然保留要删除的节点的地址。因此,它不会被删除。 只有指针p改变了,休息没问题!

但是,在递归中我们可以做到......为什么?

0 个答案:

没有答案