#ifndef __IN303_HUFTREE_H__ #define __IN303_HUFTREE_H__ #include /** * 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 (character) n'est pas garantie char character; // 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, *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); /** * 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