#define max 20 /* on considere les arbres non vide; */ struct arbre { int Taille, nombredefils; struct arbre *fils[max]; } A; int AL[max][max];/* AL[a][n] sera le nombre de listes de a arbres avec une taille totale de n*/ init() { int i,j; AL[0][0]=1; for (i=1;iTaille-1; for (i=1;inombredefils;i++) /* compter les arbres de cette taille avec i fils*/ c+=AL[i][reste]; for (i=1;i<=A->nombredefils;i++) /*et compter ceux avec le meme taille et nombre de fils que A et qui sont identiques a A dans les premiers i-1 sous-arbres mais different dans le i-eme*/ { for (j=1;jfils[i]->Taille;j++) { /* ceux ou le i-eme sous-arbre est plus petit que celui de A*/ c+=AL[1][j]*AL[A->nombredefils-i][reste-j]; } reste-=A->fils[i]->Taille; /*le nombre de sommets dans les sous-arbres a droite de i*/ c+=code(A->fils[i])*AL[A->nombredefils-i][reste]; /* et enfin ceux ou le i-eme sous arbre est de la meme taille que celui de A*/ } return c; } struct arbre * decode(int c, /*le code*/ int t /*la taille*/) { struct arbre * A; int reste, f; A=malloc(sizeof *A); A->Taille=t; if (t==1) { A->nombredefils=0; return A; } reste=t-1; /*la somme des tailles des sous-arbres*/ A->nombredefils=1; while (A->nombredefils<=reste && AL[A->nombredefils][reste]<=c) { c-=AL[A->nombredefils][reste]; A->nombredefils++; } /*le nombre de fils est determine*/ for (f=1;f<=A->nombredefils-1;f++) /* trouver le f-eme sous-arbre*/ { int ts=1; /*taille du sous-arbre*/ while (reste>=ts && AL[1][ts]*AL[A->nombredefils-f][reste-ts]<=c) { c-=AL[1][ts]*AL[A->nombredefils-f][reste-ts]; ts++; } reste-=ts; A->fils[f]=decode(c/AL[A->nombredefils-f][reste],ts); c=c%AL[A->nombredefils-f][reste]; } /*et trouver le dernier sous-arbre*/ A->fils[A->nombredefils]=decode(c,reste); return A; } void liberer(struct arbre * A) { int i; for (i=1;i<=A->nombredefils;i++) liberer(A->fils[i]); free(A); } main() {struct arbre * A; int i, f, nom=0; init(); for (i=0;i