所以,我有那个用于编码字符串的Huffman树。我已经定义了函数plant
,但我不确定我的树是否只是向一侧倾斜太多。这是我的代码:
data HuffTree
= Leaf Char
| HuffTree |*| HuffTree
deriving (Eq, Show)
|*|
是一个中缀构造函数。
plant :: [(Char,Int)] -> HuffTree
plant [(x,y)] = (Leaf x)
plant ((x,y):xs) = plant xs |*| (Leaf x)
对我而言,它看起来是片面的,因此它实际上并不意味着编码的想法,因为它不是真正的二叉树。我怎么能把它变成一个普通的二叉树?
答案 0 :(得分:5)
您没有正确构建霍夫曼树。这个过程应该是这样的:
所以我将其更改为plant :: [(HuffTree,Int)] -> HuffTree
。在第二种情况下,我对元素进行排序,取出前两个元素,合并它们,然后递归调用plant
。您可能还希望切换到(Int,HuffTree)
对,以便您可以使用默认排序实现。您还需要在Ord
派生条款中添加HuffTree
。