Ciao,
Ho fatto due procedure per cancellare l'elemento dall'albero binario ma entrambe hanno problemi...se dico di cancellare 4 ed esso è inserito tre volte loro cancellano solo il primo quattro mentre gli altri due rimangono...qualcuno sa aiutarmi?
codice:
ALBERO* deleteAlbero (ALBERO* a, int v)
{
ALBERO* t,*l,*r;
int f;
if (a==NULL)
return NULL;
else
{
if (a->val !=v)
{
t=a;
f=0;
while(f==0)
{
if (t->val<v)
if(t->right==NULL || t->right->val == v)
f=1;
else
t=t->right;
else
if(t->left==NULL || t->left->val == v)
f=2;
else
t=t->left;
}
if (f==1)
{
l=t->right->right;
r=t->right->left;
free(t->right);
t->right = r;
if (t->right ==NULL)
t->right=l;
else
{
t=t->right;
while (t->left !=NULL)
{
t=t->left;
}
t->left=l;
}
}
else
{
l=t->left->left;
r=t->left->right;
free(t->left);
t->left = r;
if (t->left ==NULL)
t->left=l;
else
{
t=t->left;
while (t->left !=NULL)
{
t=t->left;
}
t->left=l;
}
}
return a;
}
else
{
l= a->left;
r=a->right;
free(a);
if(r==NULL)
return l;
else
{
t=r;
t = t->left;
while (t->left !=NULL)
{
t=t->left;
}
t->left=l;
}
}
}
}
/*****************************************************************/
ALBERO* deleteAlberoR(ALBERO *a, int v)
{
ALBERO *l, *r, *t;
if(a==NULL)
return NULL;
else
{
l=a->left;
r=a->right;
if(a->val > v)
l=deleteAlberoR(l, v);
else
r=deleteAlberoR(r, v);
if(a->val != v)
{
a->left = l;
a->right = r;
return a;
}
else
{
free(a);
if(r==NULL)
return l;
else
return r;
}
}
}