Files
SAE32_2025/src/fr/iutfbleau/sae/mhuffman/HuffmanNode.java
T

124 lines
3.5 KiB
Java
Raw Normal View History

2026-01-07 19:27:03 +01:00
package fr.iutfbleau.sae.mhuffman;
/**
*
* Représente un nœud de l'arbre de Huffman.
*
* Un nœud peut être :
* - une feuille : il contient une valeur (symbole de 0 à 255) et sa fréquence
* - un nœud interne : il n'a pas de valeur mais possède deux enfants et une fréquence
* correspondant à la somme des fréquences de ces enfants
*
* Cette classe sert uniquement de structure pour construire l'arbre de Huffman,
* utilisé ensuite pour générer les codes dans la compression.
*/
public class HuffmanNode {
/** Valeur du symbole pour une feuille. Vaut -1 pour un nœud interne. */
private int value;
/** Fréquence associée au symbole ou somme des fréquences pour les nœuds internes. */
private int frequence;
/** Fils gauche du nœud. Null si le nœud est une feuille. */
private HuffmanNode left;
/** Fils droit du nœud. Null si le nœud est une feuille. */
private HuffmanNode right;
/**
* Constructeur d'un nœud feuille.
*
* @param value symbole représenté (entre 0 et 255)
* @param frequence fréquence d'apparition du symbole
*/
public HuffmanNode(int value, int frequence) {
if (value < 0 || value > 255) {
throw new IllegalArgumentException("Le symbole doit être entre 0 et 255.");
}
if (frequence < 0) {
throw new IllegalArgumentException("La fréquence ne peut pas être négative.");
}
this.value = value;
this.frequence = frequence;
this.left = null;
this.right = null;
}
/**
* Constructeur d'un nœud interne (créé lors de la fusion de deux sous-arbres).
*
* @param left fils gauche
* @param right fils droit
*/
public HuffmanNode(HuffmanNode left, HuffmanNode right) {
if (left == null || right == null) {
throw new IllegalArgumentException("Les deux enfants doivent être non nuls.");
}
this.value = -1; // Valeur spéciale indiquant que c'est un nœud interne
this.left = left;
this.right = right;
this.frequence = left.frequence + right.frequence;
}
/**
* Indique si le nœud est une feuille.
*
* @return true si le nœud est une feuille, false sinon
*/
public boolean isLeaf() {
return this.left == null && this.right == null;
}
/**
* Renvoie la fréquence associée à ce nœud.
*
* @return fréquence du symbole ou somme des fréquences
*/
public int getFrequence() {
return this.frequence;
}
/**
* Renvoie le fils gauche.
*
* @return fils gauche ou null si feuille
*/
public HuffmanNode getLeft() {
return this.left;
}
/**
* Renvoie le fils droit.
*
* @return fils droit ou null si feuille
*/
public HuffmanNode getRight() {
return this.right;
}
/**
* Renvoie la valeur du symbole représenté.
*
* @return valeur du symbole (0 à 255)
* @throws IllegalStateException si le nœud n'est pas une feuille
*/
public int getValue() {
if (!this.isLeaf()) {
throw new IllegalStateException("Seules les feuilles ont une valeur de symbole.");
}
return this.value;
}
/**
* Représentation textuelle du nœud. Utile en phase de débogage.
*/
@Override
public String toString() {
if (this.isLeaf()) {
return "Feuille(valeur=" + this.value + ", freq=" + this.frequence + ")";
}
return "Noeud(freq=" + this.frequence + ")";
}
}