Home Algoritmos y Estructuras de Datos (VJ1215)

Curso 2022/2023

Solución del ejercicio 1.b del tema 4

#include <algorithm> // reverse
#include <stdexcept> // out_of_range

string Huffman::codificar(const string & mensaje) const {
  
   string mensajeCodificado, caracterCodificado;
   Nodo * n;

   for (char caracter : mensaje) {
      try {
	 n = hojas.at(caracter);
      } catch(out_of_range e) {
	 throw string("El mensaje a codificar contiene algun caracter que no estaba ")
	       + string("en la tabla de frecuencias inicial (") + caracter + ").";
      }
      caracterCodificado = "";
      while (n->padre != nullptr) { // Equivale a while (n != raiz)
	 caracterCodificado += n->bit;
	 // Valdria caracterCodificado = n->bit + caracterCodificado pero seria menos eficiente
	 // Por eso usamos asi += y despues invertimos la cadena con reverse
	 n = n->padre;
      }
      reverse(caracterCodificado.begin(), caracterCodificado.end());
      mensajeCodificado += caracterCodificado;
   }

   return mensajeCodificado;

}
      

Observa que el atributo bit del nodo raíz no se utiliza.