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) { }