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(); } }
public bool IsLeaf(HuffmanNode node) { return ( node.Left == null && node.Right == null ); }