Esempio n. 1
0
 public void darCodigo(Nodo raiz, List<int> codigo)
 {
     if (raiz.esHoja())
     {
         cabecera.Add(raiz.Simbolo, codigo);
     }
     else
     {
         if (raiz.Hijoiz != null)
         {
             List<int> iz = new List<int>();
             iz.AddRange(codigo);
             iz.Add(0);
             darCodigo(raiz.Hijoiz, iz);
         }
         if (raiz.Hijoder != null)
         {
             List<int> de = new List<int>();
             de.AddRange(codigo);
             de.Add(1);
             darCodigo(raiz.Hijoder, de);
         }
     }
 }
Esempio n. 2
0
        public void crearArbol(List<byte> input)
        {
            darFrecuencias(input);
            float tam = input.Count;
            foreach (KeyValuePair<string, int> simbolo in frecuencias)
            {
                nodos.Add(new Nodo(simbolo.Key, (simbolo.Value / tam)));
            }

            int tami=nodos.Count;
            //Vamos a organizar y ordenar para combinarlos por sus frecuencias hasta que nos queden dos e ir creando el árbol
             while (nodos.Count > 1)
            {
                //Ordenamos ascendentemente cada vez que añadimos uno nuevo reformulado
                List<Nodo> ordenados = nodos.OrderBy(nodo => nodo.Frecuencia).ToList<Nodo>();
                if (ordenados.Count >= 2)
                {
                    // Cogemos los dos primeros que serán los dos con menor frecuencia para unirlos
                    List<Nodo> par = ordenados.Take(2).ToList<Nodo>();

                    // Creamos al padre como combinación
                    Nodo padre = new Nodo("0", par[0].Frecuencia + par[1].Frecuencia);
                    padre.Hijoiz= par[0];
                    padre.Hijoder=par[1];

                    //Borramos de la lista general los dos nodos unidos y añadimos el padre
                    nodos.Remove(par[0]);
                    nodos.Remove(par[1]);
                    nodos.Add(padre);
                }

             }
             raiz = nodos[0];
        }