2025-12-18 12:34:39 +01:00
|
|
|
package fr.iutfbleau.sae.mhuffman;
|
|
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/**
|
|
|
|
|
* Représente un nœud de l'arbre de Huffman.
|
|
|
|
|
* <p>
|
|
|
|
|
* Un {@code HuffmanNode} peut être :
|
|
|
|
|
* <ul>
|
|
|
|
|
* <li>une feuille, contenant une valeur (symbole) et une fréquence</li>
|
|
|
|
|
* <li>un nœud interne, contenant uniquement une fréquence et deux enfants</li>
|
|
|
|
|
* </ul>
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* <p>
|
|
|
|
|
* Cette classe est une structure de données utilisée par {@code HuffmanTree}
|
|
|
|
|
* pour construire l'arbre de Huffman.
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @author Algassimou Pellel Diallo
|
|
|
|
|
* @version 1.1
|
|
|
|
|
* @since 2025-12-17
|
|
|
|
|
*/
|
|
|
|
|
public class HuffmanNode {
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2026-01-04 18:05:46 +01:00
|
|
|
/**
|
|
|
|
|
* Valeur de la composante (symbole) représentée par ce nœud (uniquement pour les feuilles).
|
|
|
|
|
* Représente la part de la composante (rouge, verte ou bleue) dans la couleur d'un pixel.
|
|
|
|
|
* Pour les nœuds internes, cette valeur vaut -1.
|
|
|
|
|
*/
|
2025-12-18 00:19:25 +01:00
|
|
|
private int value;
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2026-01-04 18:05:46 +01:00
|
|
|
/** Fréquence du symbole (somme des fréquences des enfants pour les nœuds internes). */
|
2025-12-18 00:19:25 +01:00
|
|
|
private int frequence;
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/** Fils gauche du nœud (null si feuille). */
|
|
|
|
|
private HuffmanNode left;
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/** Fils droit du nœud (null si feuille). */
|
|
|
|
|
private HuffmanNode right;
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/**
|
|
|
|
|
* Construit un nœud feuille de Huffman.
|
|
|
|
|
* <p>
|
|
|
|
|
* Ce constructeur est utilisé pour représenter une valeur
|
|
|
|
|
* issue de la table de fréquences.
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
2026-01-04 18:05:46 +01:00
|
|
|
* @param value la valeur (symbole) représentée par ce nœud (entre 0 et 255)
|
2025-12-18 00:19:25 +01:00
|
|
|
* @param frequence la fréquence d'apparition de la valeur
|
2026-01-04 18:05:46 +01:00
|
|
|
* @throws IllegalArgumentException si la valeur n'est pas entre 0 et 255
|
|
|
|
|
* ou si la fréquence est négative
|
2025-12-18 00:19:25 +01:00
|
|
|
*/
|
|
|
|
|
public HuffmanNode(int value, int frequence) {
|
2026-01-04 18:05:46 +01:00
|
|
|
if (value < 0 || value > 255) {
|
|
|
|
|
throw new IllegalArgumentException("La valeur doit être entre 0 et 255");
|
|
|
|
|
}
|
|
|
|
|
if (frequence < 0) {
|
|
|
|
|
throw new IllegalArgumentException("La fréquence ne peut pas être négative");
|
|
|
|
|
}
|
2025-12-18 00:19:25 +01:00
|
|
|
this.value = value;
|
|
|
|
|
this.frequence = frequence;
|
|
|
|
|
this.left = null;
|
|
|
|
|
this.right = null;
|
|
|
|
|
}
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/**
|
|
|
|
|
* Construit un nœud interne de Huffman.
|
|
|
|
|
* <p>
|
|
|
|
|
* Ce constructeur est utilisé lors de la fusion de deux nœuds
|
|
|
|
|
* de plus faible fréquence lors de la construction de l'arbre.
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @param left le fils gauche
|
|
|
|
|
* @param right le fils droit
|
2026-01-04 18:05:46 +01:00
|
|
|
* @throws IllegalArgumentException si l'un des fils est null
|
2025-12-18 00:19:25 +01:00
|
|
|
*/
|
|
|
|
|
public HuffmanNode(HuffmanNode left, HuffmanNode right) {
|
2026-01-04 18:05:46 +01:00
|
|
|
if (left == null || right == null) {
|
|
|
|
|
throw new IllegalArgumentException("Les fils ne peuvent pas être null");
|
|
|
|
|
}
|
|
|
|
|
this.value = -1; // Valeur sentinelle pour les nœuds internes
|
2025-12-18 00:19:25 +01:00
|
|
|
this.left = left;
|
|
|
|
|
this.right = right;
|
|
|
|
|
this.frequence = left.frequence + right.frequence;
|
|
|
|
|
}
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/**
|
|
|
|
|
* Indique si ce nœud est une feuille.
|
|
|
|
|
*
|
|
|
|
|
* @return {@code true} si le nœud est une feuille, {@code false} sinon
|
|
|
|
|
*/
|
|
|
|
|
public boolean isLeaf() {
|
|
|
|
|
return this.left == null && this.right == null;
|
|
|
|
|
}
|
2025-12-15 20:27:25 +01:00
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/**
|
|
|
|
|
* Retourne la fréquence du nœud.
|
|
|
|
|
*
|
|
|
|
|
* @return la fréquence
|
|
|
|
|
*/
|
|
|
|
|
public int getFrequence() {
|
|
|
|
|
return this.frequence;
|
|
|
|
|
}
|
2025-12-15 20:32:35 +01:00
|
|
|
|
2025-12-18 00:19:25 +01:00
|
|
|
/**
|
|
|
|
|
* Retourne le fils gauche du nœud.
|
|
|
|
|
*
|
2026-01-04 18:05:46 +01:00
|
|
|
* @return le fils gauche, ou null si le nœud est une feuille
|
2025-12-18 00:19:25 +01:00
|
|
|
*/
|
|
|
|
|
public HuffmanNode getLeft() {
|
|
|
|
|
return this.left;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Retourne le fils droit du nœud.
|
|
|
|
|
*
|
2026-01-04 18:05:46 +01:00
|
|
|
* @return le fils droit, ou null si le nœud est une feuille
|
2025-12-18 00:19:25 +01:00
|
|
|
*/
|
|
|
|
|
public HuffmanNode getRight() {
|
|
|
|
|
return this.right;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Retourne la valeur représentée par ce nœud.
|
|
|
|
|
* <p>
|
|
|
|
|
* Cette méthode n'a de sens que si le nœud est une feuille.
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
2026-01-04 18:05:46 +01:00
|
|
|
* @return la valeur du symbole (entre 0 et 255)
|
|
|
|
|
* @throws IllegalStateException si le nœud n'est pas une feuille
|
2025-12-18 00:19:25 +01:00
|
|
|
*/
|
|
|
|
|
public int getValue() {
|
2026-01-04 18:05:46 +01:00
|
|
|
if (!this.isLeaf()) {
|
|
|
|
|
throw new IllegalStateException("La valeur n'est définie que pour les feuilles.");
|
|
|
|
|
}
|
2025-12-18 00:19:25 +01:00
|
|
|
return this.value;
|
|
|
|
|
}
|
2026-01-04 18:05:46 +01:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Retourne une représentation textuelle du nœud.
|
|
|
|
|
* <p>
|
|
|
|
|
* Utile pour le débogage et l'affichage de l'arbre.
|
|
|
|
|
* </p>
|
|
|
|
|
*
|
|
|
|
|
* @return une chaîne décrivant le nœud
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public String toString() {
|
|
|
|
|
if (this.isLeaf()) {
|
|
|
|
|
return "Feuille(valeur=" + this.value + ", freq=" + this.frequence + ")";
|
|
|
|
|
}
|
|
|
|
|
return "Noeud(freq=" + this.frequence + ")";
|
|
|
|
|
}
|
|
|
|
|
}
|