迭代删除BST

时间:2015-04-20 19:11:05

标签: c iteration binary-search-tree

我对带有通用参数的BST上的“迭代删除”代码有疑问。 我试图理解问题是关于代码相对于删除还是代码的另一部分。 如果要删除的节点不是根节点,则在创建的BST上执行代码可以正常工作,但如果我想删除根节点,则会删除BST的所有左子树。

struct arb *eliminanododato(struct arb *root, void *k, COMP fun,int dim)
{
struct arb *p=NULL;
struct arb *curr=root;
struct arb *y=NULL;
struct arb *x=NULL;
while(curr!=NULL && fun(curr->dato,k)!=0)
{
    p=curr;
    if(fun(curr->dato,k)<0)
        curr=curr->Dx;
    else
        curr=curr->Sx;
}
if(curr==NULL)
    return root;
if(curr->Sx==NULL || curr->Dx==NULL)
    y=curr;
else
{
    y=curr->Dx;
    p=curr;
    while(y->Sx!=NULL)
    {
        p=y;
        y=y->Sx;
    }
}
if(y->Sx!=NULL)
    x=y->Sx;
else
    x=y->Dx;
if(p==NULL)
    root=x;
else if(y==p->Sx)
    p->Sx=x;
else
    p->Dx=x;
if(y!=curr)
    {
    copia_dato(curr,0,y,0,sizeof(struct arb));
}
free(y);
return(root);

}

copia_dato功能是:

void copia_dato(void *dest, int dpos, void *src, int spos, int dim)
{
void *dest_addr=(void *)dest+(dpos*dim);
void *src_addr=(void *)src+(spos*dim);
memcpy(dest_addr,src_addr, dim);
}

有什么建议吗?代码是否有一些我看不到的可见错误,或者我应该关注代码的另一部分?

0 个答案:

没有答案