ho aggiunto un return null:

codice:
struct node *cerca(struct node *root,struct node *elemento){
// cerca il nodo elemento nell'albero radicato in root
	printf("stiamo cercando il nodo %s nell'albero %s\n",elemento->name,root->name);
	if (strcmp(root->name,elemento->name) == 0) {	// controlla radice
		printf("trovato\n");
		return root;
	} else { 
		if (root->children != NULL) {
			iterator i = get_iterator(root->children);
			while (has_next(i)) { 
				struct node *temp = (struct node *)next(i);
				printf("nodo in esame: %s\n",temp->name);
				//if (strcmp(temp->name,elemento->name) == 0) return temp;
				return cerca(temp,elemento);
			}
		} return NULL;
	}		
}
in questo modo non mi genera piu seg-default.. pero la ricerca termina quando un nodo non ha figli, quindi non torna indietro la chiamata ricorsiva in pratica.
cioè quando visita un nodo che non è uguale all'elemento da cercare, invece di risalire e continuare la ricerca, sospende (credo a causa el return NULL che ho messo).