Alberi random e stampa parentetica

Le seguenti due funzioni generano un albero random di un certo livello massimo. Si possono usare per generare alberi di test per verificare se le funzioni scritte sono corrette.

TipoAlbero GeneraAlberoRic(int n) {
  TipoAlbero a;
  TipoLista l;
  int i;
  int numfigli;

  a=malloc(sizeof(struct NodoAlbero));
  a->info=rand()%100-30;
  a->figli=NULL;

  if(n>0)
    numfigli=rand()%5;
  else
    numfigli=0;

  for(i=0; i<numfigli; i++) {
    l=malloc(sizeof(struct NodoLista));
    l->figlio=GeneraAlberoRic(n-1);
    l->next=a->figli;
    a->figli=l;
  }

  return a;
}

TipoAlbero GeneraAlbero(int n) {
  TipoAlbero a;

  if(rand()%(n+1)==0)
    return NULL;

  return GeneraAlberoRic(n);
}

La stampa parentetica di un albero è simile a quella che si fa nel caso della rappresentazione con vettori. A parte le parentesi, si tratta comunque della stampa dei nodi, stampando prima la radice e poi i figli. L'unica differenza è che i figli di un nodo si trovano con una scansione di una lista invece che con un ciclo su un vettore.

void StampaAlbero(TipoAlbero a) {
  int i;

  if(a==NULL) {
    printf("()");
    return;
  }

  printf("( %d ",a->info);
  for(i=0; i<a->numfigli; i++)
    StampaAlbero(a->figli[i]);
  printf(" ) ");
}