Non ne sono sicuro ma l'errore potrebbe stare nel passare radice come void ** quando potresti passarlo come NODO *.
Poi un consiglio che posso darti (anche se magari lo sai già) è quello di controllare dopo ogni malloc se il puntatore che hai cercato di allocare resta nullo. La malloc potrebbe non andare a buon fine e non appena cerchi di utilizzare quel puntatore il programma va in crash.
Quindi per esempio
codice:
radice = malloc (sizeof (*radice)); //o sizeof (NODO) se preferisci
if (radice == NULL) {
  return ERROR; //gestisci l'errore come vuoi tu
}
Poi cerca di non utilizzare goto e simili (break e continue) a meno che non sia strettamente necessario se non vuoi essere bacchettato dai tuoi professori.

Ho visto che le tue dichiarazioni di variabili stanno in mezzo al codice. Questo va bene se stai utilizzando il C99 ma è un errore se stai utilizzando l'ANSI C.