package fr.iutfbleau.sae.mpif;

/**
 * 
 * Représente un nœud utilisé pour décoder les données dans un arbre binaire.
 *
 * Un nœud peut être :
 * - un nœud interne : il possède un fils gauche et/ou un fils droit. Il ne contient pas de valeur utile.
 * - une feuille : les deux fils sont null et le nœud contient une valeur (symbole entre 0 et 255).
 *
 * Cette structure est utilisée par PIFReader pour reconstruire l'arbre de décodage
 * des codes canoniques et retrouver les valeurs des pixels.
 */
public class DecodeNode {

    /** Fils gauche du nœud. Null si le nœud est une feuille. */
    public DecodeNode left;

    /** Fils droit du nœud. Null si le nœud est une feuille. */
    public DecodeNode right;

    /** 
     * Valeur associée à la feuille. 
     * Vaut -1 pour les nœuds internes qui ne représentent aucun symbole.
     */
    public Integer value;

    /**
     * Constructeur d'un nœud interne vide.
     *
     * Le nœud ne contient pas de valeur et possède des pointeurs
     * initialement à null pour ses enfants.
     */
    public DecodeNode() {
        this.left = null;
        this.right = null;
        this.value = -1;
    }

    /**
     * Constructeur d'un nœud complet, utilisé pour créer une feuille ou un nœud interne.
     *
     * @param left fils gauche
     * @param right fils droit
     * @param value valeur associée si c'est une feuille, ou -1 pour un nœud interne
     */
    public DecodeNode(DecodeNode left, DecodeNode right, Integer value) {
        this.left = left;
        this.right = right;
        this.value = value;
    }

    /**
     * Indique si le nœud est une feuille (aucun enfant).
     *
     * @return true si le nœud est une feuille, false sinon
     */
    public boolean isLeaf() {
        return this.left == null && this.right == null;
    }
}
