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); } } }
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]; }