#ifndef __IN303_HUFTREE_H__ #define __IN303_HUFTREE_H__ #include #include typedef struct Buffer Buffer; /** * Représente un des sommets d'un arbre de Huffman */ typedef struct HufVertex HufVertex; struct HufVertex { // Indique la fréquence d'apparition de la lettre du sommet // dans le corpus original, ou bien la somme des fréquences // de ses enfants (si ce n'est pas une feuille) double frequency; // Caractère du corpus original associé à ce sommet. Uniquement // valable pour les feuilles. Pour les autres sommets, la valeur // de `name` n'est pas garantie int name; // Pointeurs vers les deux enfants de ce sommet. Ils valent tous // deux NULL si le sommet est une feuille. À noter qu'un sommet // a toujours 0 ou 2 enfants car un arbre de Huffman est binaire HufVertex* child_l; HufVertex* child_r; }; /** * Représente un arbre de Huffman */ typedef struct HufTree HufTree; struct HufTree { // Pointeur sur la racine de l'arbre HufVertex* root; // Quantité de sommets dans l'arbre size_t size; }; /** * Construire un arbre de Huffman basé sur les fréquences * de caractères passées dans `frequencies` * * (résultat à libérer avec `freeTree`) */ HufTree createTree(double* frequencies); /** * Écrit une représentation binaire de l'arbre dans le * tampon passé en paramètre */ void writeTree(HufTree, Buffer*); /** * Reconstruit un arbre de Huffman à partir du fichier passé * en paramètre */ HufTree readTree(FILE*); /** * Libérer la mémoire occupée par un arbre de Huffman * généré par la fonction `createTree` */ void freeTree(HufTree tree); /** * Associer à chaque feuille de l'arbre une étiquette unique basée * sur sa position dans l'arbre. Aucune étiquette n'est ainsi préfixe * d'une autre. Le tableau renvoyé associe chaque caractère ASCII * à son préfixe, ou à NULL s'il n'est pas présent dans l'arbre * * (résultat à libérer avec `freeTreeLabels`) */ char** createTreeLabels(HufTree tree); /** * Libérer la mémoire occupée par un tableau d'étiquettes renvoyé * par la fonction `labelTree` */ void freeTreeLabels(char** labels); #endif