我正在尝试使用自制的霍夫曼编码。如果没有轻微的缺陷,我已经进行了二元树生成。
当他们的深度超过一级时,我的叶子会消失。我的根节点将有子节点,但这些子节点的叶子为空。我认为这与没有被保留的参考文献有关,但我似乎无法在两天之后把它弄清楚。
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函数中不起作用。
答案 0 :(得分:2)
我检查了你的代码,看起来它应该正常工作。我还运行了你在GitHub上的代码,你的程序正确地构建了树。在fillTree
操作之后生成的根具有正确的子级,多个级别(而不是只有一个级别,如您所述)。
当我检查结果值及其权重,并使用此在线霍夫曼编码演示(http://courses.cs.washington.edu/courses/cse373/04sp/fullhuffmandemo.html)交叉引用它时,我得到完全相同的权重,当我用你的句子“j'aime运行你的程序时离开aller sur le bord de l'eau les jeudis ou les jours impairs“。
你确定你没有解释自己的错误吗?