No, mi riferisco a questo:
codice:
void cancellazione_elemento(tree Y, int elem)
{
    if(Y->value < elem)
        cancellazione_elemento(Y->dx, elem);
    if(Y->value > elem)
        cancellazione_elemento(Y->sx, elem);
    else//se Y->value risulta uguale all elemento che vogliamo eliminare
        {
         if(Y->sx == NULL && Y->dx == NULL)
            {
             free(Y);
             Y=NULL;
            }
         if(Y->sx != NULL && Y->dx == NULL) /* prossima istruzione eseguita */
            {
             Y->value = Y->sx->value;
             free(Y->sx);
             Y->sx=NULL;
            }
         if(Y->sx == NULL && Y->dx != NULL)
            {
              Y->value = Y->dx->value;
             free(Y->dx);
             Y->dx=NULL;
            }
         if(Y->sx != NULL && Y->dx != NULL)
             printf("Non posso eliminare questo nodo poichè entrambi i suoi rami contengono dei dati!\n");
        }
     stampa_tutto(Y);
}
Se annulli il puntatore, dereferiarlo implica un crash. Se liberi il puntatore e non lo annulli, hai comunque un crash perché dopo hai qualcosa di non più valido. E questo succede perché i vari if non sono esclusivi, ma sono eseguiti in sequenza.
Basta aggiungere un else
codice:
void cancellazione_elemento(tree Y, int elem)
{
    if(Y->value < elem)
        cancellazione_elemento(Y->dx, elem);
    if(Y->value > elem)
        cancellazione_elemento(Y->sx, elem);
    else//se Y->value risulta uguale all elemento che vogliamo eliminare
        {
         if(Y->sx == NULL && Y->dx == NULL)
            {
             free(Y);
             Y=NULL;
            }
        else if(Y->sx != NULL && Y->dx == NULL)
            {
             Y->value = Y->sx->value;
             free(Y->sx);
             Y->sx=NULL;
            }
         else if(Y->sx == NULL && Y->dx != NULL)
            {
              Y->value = Y->dx->value;
             free(Y->dx);
             Y->dx=NULL;
            }
         else if(Y->sx != NULL && Y->dx != NULL)
             printf("Non posso eliminare questo nodo poichè entrambi i suoi rami contengono dei dati!\n");
        }
     stampa_tutto(Y);
}