C++ 我的哈夫曼编码方法哪里出错了?

C++ 我的哈夫曼编码方法哪里出错了?,c++,algorithm,huffman-code,C++,Algorithm,Huffman Code,我正在尝试编写一个哈夫曼字符串编码算法 我的解决方案是这样工作的: 因为字符串中的每个字母都有一个与之关联的特殊二进制代码,所以搜索二叉树,当找到一个字母时,用二进制代码将其添加到映射中。我错在这里 迭代字符串,并为每个字母关联与映射字母键关联的值。 我没有把这棵树打印在什么地方,即使很难,它也可以帮助你帮助我,但这是我为这根绳子所得到的,我应该得到的: 正确代码:000010101101011111101011011011111110110100111011110101110010111000

我正在尝试编写一个哈夫曼字符串编码算法

我的解决方案是这样工作的:

因为字符串中的每个字母都有一个与之关联的特殊二进制代码,所以搜索二叉树,当找到一个字母时,用二进制代码将其添加到映射中。我错在这里 迭代字符串,并为每个字母关联与映射字母键关联的值。 我没有把这棵树打印在什么地方,即使很难,它也可以帮助你帮助我,但这是我为这根绳子所得到的,我应该得到的:

正确代码:0000101011010111111010110110111111101101001110111101011100101110000110000101111001111011111101010010

我得到的是: 000010011101011111010101100011101011010

这是我的密码:

包括 包括 字符串代码=; void getMapCharBinaryCodeNode根、字符串和前缀、映射和m{ 如果!根返回; ifroot->value{ 如果!m.countroot->value{ m[根->值]=前缀; 前缀=; } } ifroot->leftChild{ getMapCharBinaryCoderoot->leftChild,前缀+=0,m; } ifroot->rightChild{ getMapCharBinaryCoderoot->rightChild,前缀+=1,m; } } 字符串编码字符串文本,节点树{ //文本为abracadabra //为每个字符创建映射->二进制代码 地图m; 字符串前缀=; getMapCharBinaryCodetree,前缀,m; //对文本进行迭代,并使用map中的二进制代码分配每个字母 forint i=0;i当保存前缀为“”的叶时,您正在销毁前缀中的代码,当将代码放回树并转到下一个分支时,需要该代码

您可以维护前缀的单个存储区域,通过引用传递它。但是,在树上下移动时,需要管理前缀的长度,不需要添加0,然后为两个分支添加1,为右分支添加01,而不是1


首先,您应该按值传递前缀,这样可以创建副本,但在管理时不需要注意。去掉&并将前缀+=替换为前缀+。去掉前缀=,它什么也不做。

首先,尽量减少创建错误输出所需的输入。然后使用调试器在监视变量及其值的同时逐条检查代码语句,以查看何时何地出错。输入文本是什么?请提供一个示例,包括适当的输入,以演示问题。嗨,Yolan,欢迎使用堆栈溢出。我很高兴马克给出的答案对你有用,这是个好答案。然而,在问题中添加正确的代码并不是我们的“风格”——这可能被视为某种程度上“破坏”了连续性。你已经将答案标记为已接受就足够了,这样,其他查看此Q/A的人就会知道它按预期工作。尽管Yolan可以,如果他们愿意,用正确的代码发布他们自己问题的答案。@YolanMaldonado请不要编辑问题以包含答案。这是一个非常好的建议:我认为OP没有收到你评论的通知。将此评论复制到OP问题的评论中会不会太麻烦?我想他们会从中受益匪浅,最终可能会给出一个真正的答案。谢谢:@yolanmaldonado现在你可以使用它了,你可以上下运行一个引用前缀,这样效率更高。您需要为左分支添加一个字符,然后替换该字符,而不是为右分支添加另一个字符,然后在返回之前删除该字符,以将前缀恢复到进入例程时的状态。处理叶子时不要弄乱前缀。@MarkAdler感谢您编辑评论,为OP添加ping,我很感激: