Пример #1
0
        public void Build(string source)
        {
            for ( int i = 0; i < source.Length; i++ ) {
                if ( !Frequencies.ContainsKey( source[i] ) ) {
                    Frequencies.Add( source[i], 0 );
                }

                Frequencies[source[i]]++;
            }

            foreach ( KeyValuePair<char, int> symbol in Frequencies ) {
                nodes.Add( new HuffmanNode() { Symbol = symbol.Key, Frequency = symbol.Value } );
            }

            while ( nodes.Count > 1 ) {
                List<HuffmanNode> orderedNodes = nodes.OrderBy( node => node.Frequency ).ToList<HuffmanNode>();

                if ( orderedNodes.Count >= 2 ) {
                    // Take first two items
                    List<HuffmanNode> taken = orderedNodes.Take( 2 ).ToList<HuffmanNode>();

                    // Create a parent node by combining the frequencies
                    HuffmanNode parent = new HuffmanNode() {
                        Symbol = '*',
                        Frequency = taken[0].Frequency + taken[1].Frequency,
                        Left = taken[0],
                        Right = taken[1]
                    };

                    nodes.Remove( taken[0] );
                    nodes.Remove( taken[1] );
                    nodes.Add( parent );
                }

                this.Root = nodes.FirstOrDefault();

            }
        }
Пример #2
0
 public bool IsLeaf(HuffmanNode node)
 {
     return ( node.Left == null && node.Right == null );
 }