Example #1
0
 //ASIGNAR A CADA NODO SU CODIGO EN BASE A SU POSICION EN EL ARBOL, EN UN DICCIONARIO SE GUARDA EL CODIGO DE CADA HOJA
 public void Codigo(NodoHuffman nodo, NodoHuffman nodopadre, string lado)
 {
     if (nodo.HijoIzquierdo != null)
     {
         nodo.HijoIzquierdo.codigo = nodo.codigo + "0";
         Codigo(nodo.HijoIzquierdo, nodo, "iz");
     }
     if (nodo.HijoDerecho != null)
     {
         nodo.HijoDerecho.codigo = nodo.codigo + "1";
         Codigo(nodo.HijoDerecho, nodo, "der");
     }
     if (EsHoja(nodo))
     {
         if (lado == "iz")
         {
             nodo.codigo = nodopadre.codigo + "0";
             Diccionariocodigos.Add(nodo.caracter, nodo.codigo);
         }
         if (lado == "der")
         {
             nodo.codigo = nodopadre.codigo + "1";
             Diccionariocodigos.Add(nodo.caracter, nodo.codigo);
         }
     }
 }
Example #2
0
 public bool EsHoja(NodoHuffman nodo)
 {
     if (nodo.HijoIzquierdo == null && nodo.HijoIzquierdo == null)
     {
         return(true);
     }
     else
     {
         return(false);
     }
 }
Example #3
0
 //CREAR ARBOL EN BASE A SU PROBABILIDAD
 public void AgregarNodoAlArbol(List <NodoHuffman> listadeNodos)
 {
     OrdenamientoListaNodos(listadeNodos);
     //Ya que deben de existir minimo 2 nodos para poder emparejarlos
     if (listaNodos.Count > 2)
     {
         var nodotemp = new NodoHuffman();
         //La probabilidad del nodo es la suma de la probabilidad de sus nodos hijos, iz y derecha.
         nodotemp.probabilidad = (listaNodos[0].probabilidad + listaNodos[1].probabilidad);
         //Ya que cuando es un nodo, producto de la suma de 2 letras, no nos importa el caracter, solo su probabilidad
         nodotemp.caracter = Convert.ToString("x");
         //El nodo con menor probabilidad se convierte en el hijo derecha.
         if (listadeNodos[0].probabilidad < listadeNodos[1].probabilidad)
         {
             nodotemp.HijoIzquierdo = listaNodos[1];
             nodotemp.HijoDerecho   = listaNodos[0];
         }
         else if (listadeNodos[1].probabilidad < listadeNodos[0].probabilidad)
         {
             nodotemp.HijoIzquierdo = listaNodos[0];
             nodotemp.HijoDerecho   = listaNodos[1];
         }
         else
         {
             nodotemp.HijoIzquierdo = listaNodos[1];
             nodotemp.HijoDerecho   = listaNodos[0];
         }
         //Eliminamos los 2 mas pequeños de la lista, ya que forman un nuevo nodo, y se vuelven hijos del nuevo nodo
         listaNodos.RemoveAt(0);
         listaNodos.RemoveAt(0);
         //Se agrega a la lista de nodos, el nuevo nodo creado
         listaNodos.Add(nodotemp);
         Arbol.Add(nodotemp);
         //Se ordena nuevamente encontrar nuevamente los 2 mas pequeños
         //La función es recursiva, hasta que en la lista unicamente queden menos de 2 nodos
         AgregarNodoAlArbol(listaNodos);
     }
     else
     {
         NodoHuffman nodotemp = new NodoHuffman();
         //La probabilidad del nodo es la suma de la probabilidad de sus nodos hijos, iz y derecha.
         nodotemp.probabilidad = (listaNodos[0].probabilidad + listaNodos[1].probabilidad);
         //Ya que cuando es un nodo, producto de la suma de 2 letras, no nos importa el caracter, solo su probabilidad
         nodotemp.caracter      = Convert.ToString("x");
         nodotemp.HijoIzquierdo = listaNodos[1];
         nodotemp.HijoDerecho   = listaNodos[0];
         Arbol.Add(nodotemp);
         string lado = "raiz";
         Codigo(nodotemp, nodotemp, lado);
         GenerarTextoCodigo(Diccionariocodigos);
         Agrupar();
     }
 }
Example #4
0
 //Recibe el string de caracteres y los agrega a un dicctionario, con su respectiva probabilidad y caracter, para luego crear los nodos
 public void agregarNodos(Dictionary <string, int> Diccionario_Caracteres, List <string> Text_archivo, List <NodoHuffman> listadeNodos, string path)
 {
     texto    = Text_archivo;
     FilePath = path;
     foreach (var item in Diccionario_Caracteres)
     {
         var nodotemp = new NodoHuffman();
         nodotemp.probabilidad = Math.Round((item.Value / Convert.ToDouble(Text_archivo.Count)), 5); //Calcula la probabilidad
         nodotemp.caracter     = item.Key;                                                           //El caracter es la llave primaria
         listadeNodos.Add(nodotemp);                                                                 //Agrega cada nuevo nodo a una lista de nodos
     }
     AgregarNodoAlArbol(listadeNodos);                                                               //Llama a la funcion para agregar los nodos al arbol
 }