Example #1
0
 public HuffmanTree(HuffmanLeafNode <T> firstInit, HuffmanLeafNode <T> secondInit)
 {
     root = new HuffmanTreeNode();
     if (firstInit.frequency > secondInit.frequency)
     {
         root.left  = secondInit;
         root.right = firstInit;
     }
     else
     {
         root.left  = firstInit;
         root.right = secondInit;
     }
     CalcRootFrequency();
 }
Example #2
0
        public static HuffmanTree <T> ReconstructFromTable(Dictionary <HFCode, T> table)
        {
            HuffmanTree <T> hfTree = new HuffmanTree <T>();

            hfTree.root = new HuffmanTreeNode(-1);
            foreach (KeyValuePair <HFCode, T> pair in table)
            {
                BitArray        bitCode  = pair.Key.GetBitCode();
                HuffmanTreeNode curNode  = hfTree.root;
                HuffmanTreeNode prevNode = curNode;
                for (int i = 0; i < bitCode.Length; ++i)
                {
                    //Go left or right depending on bitCode
                    prevNode = curNode;
                    curNode  = (bitCode[i]) ? curNode.right : curNode.left;
                    if (curNode == null)
                    {
                        if (i == bitCode.Length - 1) //Create leaf
                        {
                            HuffmanLeafNode <T> hfLeafNode = new HuffmanLeafNode <T>(pair.Value, 0);
                            curNode = hfLeafNode;
                        }
                        else
                        {
                            curNode = new HuffmanTreeNode(i);
                        }

                        if (bitCode[i])
                        {
                            prevNode.right = curNode;
                        }
                        else
                        {
                            prevNode.left = curNode;
                        }
                    }
                }
            }
            return(hfTree);
        }
Example #3
0
        private HuffmanTree <T> GenerateTree(HuffmanList <T> list)
        {
            IHuffmanNode[]      curNodes = new IHuffmanNode[4];
            HuffmanListNode <T> listFirst, listSecond;
            HuffmanListNode <HuffmanTree <T> > treeFirst, treeSecond;
            HuffmanList <HuffmanTree <T> >     subTrees = new HuffmanList <HuffmanTree <T> >();

            while (list.Count > 0 || subTrees.Count > 1)
            {
                list.GetTwoLowestFreqNodes(out listFirst, out listSecond);
                subTrees.GetTwoLowestFreqNodes(out treeFirst, out treeSecond);
                curNodes[0] = listFirst;
                curNodes[1] = listSecond;
                if (treeFirst != null)
                {
                    curNodes[2] = treeFirst.info.root;
                    if (treeSecond != null)
                    {
                        curNodes[3] = treeSecond.info.root;
                    }
                    else
                    {
                        curNodes[3] = null;
                    }
                }
                else
                {
                    curNodes[2] = curNodes[3] = null;
                }


                double lowestFreq = double.MaxValue, secondLowestFreq = double.MaxValue;
                int    lowestIndex = 0, secondLowestIndex = 1;

                for (int i = 0; i < 4; ++i)
                {
                    if (curNodes[i] != null)
                    {
                        if (curNodes[i].GetFrequency() <= lowestFreq)
                        {
                            secondLowestFreq  = lowestFreq;
                            secondLowestIndex = lowestIndex;
                            lowestFreq        = curNodes[i].GetFrequency();
                            lowestIndex       = i;
                        }
                        else if (curNodes[i].GetFrequency() <= secondLowestFreq)
                        {
                            secondLowestFreq  = curNodes[i].GetFrequency();
                            secondLowestIndex = i;
                        }
                    }
                }
                //If both nodes are from list, create a new subtree
                if (lowestIndex < 2 && secondLowestIndex < 2)
                {
                    HuffmanLeafNode <T> first      = new HuffmanLeafNode <T>(listFirst.info, listFirst.frequency);
                    HuffmanLeafNode <T> second     = new HuffmanLeafNode <T>(listSecond.info, listSecond.frequency);
                    HuffmanTree <T>     newSubTree = new HuffmanTree <T>(first, second);
                    subTrees.Add(newSubTree, newSubTree.GetRootFrequency());
                    list.RemoveNode(listFirst);
                    list.RemoveNode(listSecond);
                }
                else if (lowestIndex >= 2 && secondLowestIndex >= 2)   //Merge trees
                {
                    treeFirst.info.Combine(treeSecond.info.root);
                    subTrees.SetFrequency(treeFirst, treeFirst.info.GetRootFrequency());
                    subTrees.RemoveNode(treeSecond);
                }
                else
                {
                    HuffmanLeafNode <T> first = new HuffmanLeafNode <T>(listFirst.info, listFirst.frequency);
                    treeFirst.info.Combine(first);
                    subTrees.SetFrequency(treeFirst, treeFirst.info.GetRootFrequency());
                    list.RemoveNode(listFirst);
                }
            }
            return(subTrees[0].info);
        }