我试图使用数组构建一个Huffman树。每次我组合两个节点,我将新节点添加到数组并进行排序。我的代码适用于某些测试用例,但对于其他测试用例,它会生成错误的代码。有人可以指点我直接调试吗?谢谢!
这是我的压缩功能的一部分。
while(tree->getSize() != 1)
{
right = tree->getMinNode();
left = tree->getMinNode();
Node *top = new Node;
top->initializeNode((char)1, left->getFrequency() + right->getFrequency(), left, right);
tree->insertNode(top);
} // while
root = tree->getRootNode();
tree->encodeTree(root, number, 0);
tree->printCode(data);
getMinNode()函数返回最小的节点,在插入组合了2个最小节点的节点后,我使用qsort对数组进行排序。这是我用来排序数组的函数。
我正在排序:第一个是频率,第二个是数据。如果节点不是叶节点,意味着它不包含未压缩数据中显示的字符之一,我使用函数getMinData()找到子树中的最小数据。
int Tree::compareNodes(const void *a, const void *b)
{
if( ((Node *)a)->frequency < ((Node *)b)->frequency )
return -1;
if( ((Node *)a)->frequency > ((Node *)b)->frequency )
return 1;
if( ((Node *)a)->frequency == ((Node *)b)->frequency )
{
if( ((Node *)a)->isLeafNode() && ((Node *)b)->isLeafNode() )
{
if( (int)((Node *)a)->data < (int)((Node *)b)->data )
return -1;
if( (int)((Node *)a)->data > (int)((Node *)b)->data )
return 1;
} // if
else
{
int minA, minB;
minA = (int)((Node *)a)->data;
minB = (int)((Node *)b)->data;
if(!((Node *)a)->isLeafNode())
getMinData(a, &minA);
if(!((Node *)b)->isLeafNode())
getMinData(b, &minB);
if(minA < minB)
return -1;
if(minA > minB)
return 1;
}// else
} // if
return 0;
} // compareNodes()
例如,假设我有以下文字。
我同意Emily Grierson小姐是旧南方的象征。她的家庭和家庭传统支持这一建议。但是,我并不认为她是骑士,正式礼仪和传统价值观的牺牲品。我认为这些价值观会对人产生积极影响,而不会产生负面影响。如果出于任何原因让艾米丽离开她的社区并最终杀死了她喜欢的男人,那就是她自己。她在故事中充当了自己的对手,因为除了她自己以外,她与其他任何人都没有冲突。她使自己成为一个“受害者”,就像没有朋友和悲惨一样。教给她的传统和礼仪可能会对她的行为产生影响,但是她对外界的态度使她与其他市民分开了 \ n
与&#39; \ n&#39;在末尾。一些人物我得到了正确的霍夫曼码,但其他一些我不知道。 Ascii 83(&#39; S&#39;),120(&#39; x&#39;),84(&#39; T&#39;)是一些代码错误的字符。谢谢!