public override void DoPOT(IHuffmanTreeVisitor visitor)
        {
            HuffmanTreeNode node  = root;
            int             level = 0;

            Stack <HuffmanTreeNode> stack = new Stack <HuffmanTreeNode>();

            while (true)
            {
                if (node != null)
                {
                    stack.Push(node);
                    node = node.Left;
                    visitor.VisitLeftEdge(++level);
                }
                else
                {
                    if (stack.Count == 0)
                    {
                        return;
                    }

                    if (stack.Peek().Right == null)
                    {
                        visitor.VisitBackEdge(--level);
                        node = stack.Pop();
                        if (node.IsLeaf)
                        {
                            visitor.VisitNode(node);
                        }

                        while (stack.Count != 0 && node == stack.Peek().Right)
                        {
                            visitor.VisitBackEdge(--level);
                            node = stack.Pop();
                            if (node.IsLeaf)
                            {
                                visitor.VisitNode(node);
                            }
                        }
                    }
                    if (stack.Count != 0)
                    {
                        node = stack.Peek().Right;
                        visitor.VisitRightEdge(level);
                    }
                    else
                    {
                        node = null;
                    }
                }
            }
        }
        public override void DoBFS(IHuffmanTreeVisitor visitor)
        {
            Guard.IsNotNull(visitor, nameof(visitor));

            Queue <HuffmanTreeNode> bfsQueue = new Queue <HuffmanTreeNode>(64);

            bfsQueue.Enqueue(root);
            while (bfsQueue.Count != 0)
            {
                HuffmanTreeNode node = bfsQueue.Dequeue();
                visitor.VisitNode(node);
                if (node == null)
                {
                    continue;
                }
                bfsQueue.Enqueue(node.Left);
                bfsQueue.Enqueue(node.Right);
            }
        }
 public abstract void DoPOT(IHuffmanTreeVisitor visitor);
 public override void DoPOT(IHuffmanTreeVisitor visitor)
 {
 }