public void Dispose()
 {
     RootNode.Dispose();
     NodesCounter = 0;
     PqNodeSelector.Clear();
     PqNodeSelector = null;
     NodesFrequency.Clear();
     NodesFrequency = null;
     TreeNodes.Clear();
     TreeNodes = null;
     TreePaths.Clear();
     TreePaths = null;
 }
        /**
         * build the tree
         */
        private void InitSelection()
        {
            while (PqNodeSelector.Count > 1)
            {
                // get the minimum 2 node
                HuffmanNode rightNode = PqNodeSelector.Dequeue();
                HuffmanNode leftNode  = PqNodeSelector.Dequeue();

                HuffmanNode parentNode = new HuffmanNode(-1,
                                                         rightNode.Frequincy + leftNode.Frequincy,
                                                         leftNode, rightNode);

                PqNodeSelector.Enqueue(parentNode);
                NodesCounter++;
            }

            // the final node is the root node
            RootNode = (HuffmanNode)PqNodeSelector.Dequeue();
        }