【发布时间】:2014-06-09 14:38:53
【问题描述】:
我正在尝试自制霍夫曼编码。我已经开始生成二叉树了,如果不是因为一个小缺陷的话。
当叶子超过一层深度时,它们就会消失。我的根节点将有孩子,但这些孩子的叶子将为 null。我相信这与没有保留参考文献有关,但两天后我似乎无法弄清楚。
private HuffmanTree fillTree(PriorityQueue<HuffmanTree> _eQueue)
{
while (_eQueue.count > 1)
{
///Dequeue children
HuffmanTree node1 = _eQueue.Dequeue();
HuffmanTree node2 = _eQueue.Dequeue();
///Create new parent
HuffmanTree parent = new HuffmanTree();
///Set up relations
parent.node_left = node1;
parent.node_right = node2;
node1.parent = parent;
node2.parent = parent;
///Give parent the weight of it's children combined
parent.weight = node1.weight + node2.weight;
///Reinsert parent into priority queue
_eQueue.Enqueue(parent, parent.weight);
}
///Return the last object in the queue
return _eQueue.Dequeue();
}
这是我用来生成霍夫曼树的代码。
public HuffmanTree node_left { get; set; }
public HuffmanTree node_right { get; set; }
public HuffmanTree parent { get; set; }
public int weight { get; set; }
public char value { get; set; }
这些是类变量。
你们能帮帮我吗?
我的项目也在 github 上。如果你愿意,你可以去看看。
https://github.com/samynv/HufmanEncoding
所有工作都在 Dev 分支中完成。该代码在 createTree 函数中运行良好,但在 compressString 函数中无法运行。
【问题讨论】:
-
对我来说很合适。您如何观察树的状态以确定它的深度仅为 1?
-
我正在使用调试器观察我的值。当我尝试使用二叉树对字符串进行编码时,问题最初就开始了。出于某种原因,它从未生成具有值的节点。我用局部变量运行调试器并开始手动查看叶子。在深度一深之后它就消失了。
-
您应该使用调试器来验证您的程序是否正在执行它应该执行的操作,或者如果您不确定,请查看它正在执行的操作。您不应该将它用作获取程序输出的主要手段;程序应该在没有调试器的情况下做到这一点。除其他问题外,如果您的程序实际上从未观察到某个值,那么编译器可以进行各种优化,例如,从不实际计算它。
-
确实,Servy 提到,使用调试器手动遍历树并不总是那么可靠。不过,在您的具体示例中,我可以正确遍历它。
标签: c# encoding binary-tree huffman-code