diff --git a/src/huftree.c b/src/huftree.c index 6bb05f9..e877ca3 100644 --- a/src/huftree.c +++ b/src/huftree.c @@ -101,6 +101,24 @@ HufTree createTree(bytecount* counts) { // Cas particulier : aucun caractère dans le fichier, dans ce // cas l'arbre est l'arbre vide tree = NULL; + } else if (leaves_count == 1) { + // Cas particulier : un seul type de caractère dans le fichier, + // dans ce cas on crée un noeud artificiel et une racine. Sans + // cette opération, on aurait un arbre avec un unique sommet et + // donc une étiquette vide + HufTree child_l = remaining[0]; + HufTree child_r = malloc(sizeof(*child_r)); + tree = malloc(sizeof(*tree)); + + tree->value = -1; + tree->count = -1; + tree->child_l = child_l; + tree->child_r = child_r; + + child_r->value = -1; + child_r->count = -1; + child_r->child_l = NULL; + child_r->child_r = NULL; } else { // Sinon, la racine de l'arbre est le dernier sommet encore // dans le tableau `remaining` @@ -245,7 +263,9 @@ void _labelVertex(HufVertex vertex, char** labels, char* label, size_t length) { } else { // Si le sommet est une feuille, étiquetage du caractère // associé avec l'étiquette passée en paramètre. Fin de la récursion - labels[vertex.value] = label; + if (vertex.value != -1) { + labels[vertex.value] = label; + } } }