建造适当的树

时间:2015-07-05 23:23:11

标签: haskell tree binary-tree huffman-code algebraic-data-types

所以,我有那个用于编码字符串的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) 

对我而言,它看起来是片面的,因此它实际上并不意味着编码的想法,因为它不是真正的二叉树。我怎么能把它变成一个普通的二叉树?

1 个答案:

答案 0 :(得分:5)

您没有正确构建霍夫曼树。这个过程应该是这样的:

  1. 将所有源符号转换为单元素霍夫曼树
  2. 将每个源符号与其频率对齐成一个大的树/频率对列表。
  3. 如果只剩下一棵树/频率对,那么这棵树就是你的霍夫曼树。
  4. 否则删除具有最低频率的两个树/频率对,组合树并添加频率以生成新的树/频率对,并将其添加回列表。
  5. 转到3。
  6. 所以我将其更改为plant :: [(HuffTree,Int)] -> HuffTree。在第二种情况下,我对元素进行排序,取出前两个元素,合并它们,然后递归调用plant。您可能还希望切换到(Int,HuffTree)对,以便您可以使用默认排序实现。您还需要在Ord派生条款中添加HuffTree