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
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.codice:radice = malloc (sizeof (*radice)); //o sizeof (NODO) se preferisci if (radice == NULL) { return ERROR; //gestisci l'errore come vuoi tu }
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.