哈夫曼树生成正常但编码器映射表为空的问题求助
哈夫曼树生成正常但编码器映射表为空的问题求助
看起来你已经把哈夫曼树的结构和优先队列都搭得有模有样了,结果卡在生成编码这一步——明明树建好了,编码器映射表却空空如也,这确实挺闹心的。我帮你捋了下代码,问题出在类型断言的匹配逻辑上,咱们一步步说清楚:
问题根源
- 节点类型不匹配:你在
BuildTree里创建内部节点时,用的是指针:internalNode := &HuffNode{...},也就是说最终的哈夫曼树里,非叶子节点都是*HuffNode指针类型。但在GenerateCodes的switch判断里,你写的是case HuffNode:,这是在匹配值类型的HuffNode,完全对应不上实际的节点类型,导致递归根本没法遍历到叶子节点,编码器自然就没内容了。 - prefix手动回退多余且危险:
append(prefix, '0')会生成一个新的切片,每个递归调用用的都是独立的切片副本,你手动写的prefix = prefix[:len(prefix)-1]不仅多余,还可能在prefix为空时触发索引越界panic。
修复后的GenerateCodes函数
func GenerateCodes(tree HuffTree, prefix []byte, encoder map[rune]string) map[rune]string{ switch t := tree.(type) { case LeafNode: encoder[t.char] = string(prefix) case *HuffNode: // 改成匹配指针类型 // 左子树追加0,直接传append后的新切片,无需手动回退 GenerateCodes(t.left_child, append(prefix, '0'), encoder) // 右子树追加1,同理传新切片 GenerateCodes(t.right_child, append(prefix, '1'), encoder) } return encoder }
修复说明
- 把
case HuffNode:改为case *HuffNode:,让类型断言能正确匹配到你构建的内部节点指针; - 删掉那两行多余的
prefix回退代码,因为每个递归调用的prefix都是独立的新切片,不会互相干扰。
测试效果
用你给出的频率表(A:3, b:2, c:1, a:5),修改后应该能得到类似这样的编码器结果(具体编码可能因树的构建顺序略有差异,但所有字符都会被正确映射):
char: a, value: 0 char: A, value: 10 char: b, value: 111 char: c, value: 110
备注:内容来源于stack exchange,提问作者Gaurav Tak
相关产品推荐
相关产品推荐

