public HuffmanTreeLeafNode(HuffmanSymbolNode symbol)
 {
     Symbol = symbol;
 }
        private void GenerateCode()
        {
            var input = new List <HuffmanSymbolNode>();

            for (int i = 0; i < 512; i++)
            {
                if (frequncy[i] > 0)
                {
                    var node = new HuffmanSymbolNode();
                    node.Symbol    = i;
                    node.Frequency = frequncy[i];
                    input.Add(node);
                }
            }

            var a = input.ToArray();

            Array.Sort(a, delegate(HuffmanSymbolNode l, HuffmanSymbolNode r)
            {
                if (l.Frequency == r.Frequency)
                {
                    return(l.Symbol.CompareTo(r.Symbol));
                }
                return(l.Frequency.CompareTo(r.Frequency));
            });

            while (true)
            {
                var t = generateTree(a);
                t.UpdateDepth(0);
                if (input.All(x => x.Length <= 15))
                {
                    break;
                }
                for (int i = 0; i < a.Length; i++)
                {
                    a[i].Frequency = a[i].Frequency / 2 + 1;
                }
            }

            Array.Sort(a, delegate(HuffmanSymbolNode l, HuffmanSymbolNode r)
            {
                if (l.Length == r.Length)
                {
                    return(l.Symbol.CompareTo(r.Symbol));
                }
                return(l.Length.CompareTo(r.Length));
            });

            int ncode = 0;
            int len   = 0;

            foreach (var x in a)
            {
                while (len < x.Length)
                {
                    ncode *= 2;
                    len++;
                }
                x.Code = ncode;
                ncode++;
            }

            code = new Dictionary <int, HuffmanSymbolNode>();
            foreach (var x in a)
            {
                code.Add(x.Symbol, x);
            }
        }