コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
                }
            }
        }