public void BuildTree(byte[] data, long dataSize) { huffmanTreeList.Clear(); foreach (var entry in frequencyTable) { huffmanTreeList.Add(entry); } while (huffmanTreeList.Count > 1) { huffmanTreeList = huffmanTreeList.OrderBy(Node => Node.frequency).ToList(); var Node1 = huffmanTreeList.ElementAt(0); var Node2 = huffmanTreeList.ElementAt(1); var parent = new StaticHuffmanNode { name = null, frequency = Node1.frequency + Node2.frequency, left = Node1, right = Node2 }; Node1.parent = parent; Node2.parent = parent; huffmanTreeList.RemoveRange(0, 2); huffmanTreeList.Insert(0, parent); } }
public void BuildCodes(StaticHuffmanNode thisNode = null) { if (thisNode == null) { thisNode = huffmanTreeList.ElementAt(0); } StaticHuffmanNode leftNode = thisNode.left; StaticHuffmanNode rightNode = thisNode.right; if (leftNode == null && rightNode == null) { thisNode.binaryCode = new List <bool>() { true }; huffmanCodes[(char)thisNode.name] = new List <bool>() { true }; } if (thisNode.parent == null)//Root ise { if (leftNode != null) { leftNode.binaryCode = new List <bool>() { false }; } if (rightNode != null) { rightNode.binaryCode = new List <bool>() { true }; } } else { if (leftNode != null) { leftNode.binaryCode = new List <bool>(); leftNode.binaryCode.AddRange(thisNode.binaryCode); leftNode.binaryCode.Add(false); } if (rightNode != null) { rightNode.binaryCode = new List <bool>(); rightNode.binaryCode.AddRange(thisNode.binaryCode); rightNode.binaryCode.Add(true); } } if (leftNode != null) { if (!leftNode.isLeaf) { BuildCodes(leftNode); } else { huffmanCodes.Add((char)leftNode.name, leftNode.binaryCode); } } if (rightNode != null) { if (!rightNode.isLeaf) { BuildCodes(rightNode); } else { huffmanCodes.Add((char)rightNode.name, rightNode.binaryCode); } } }