给出奇怪树的哈夫曼编码算法(Java)

时间:2011-10-05 05:01:32

标签: java algorithm encoding huffman-code

我在这里尝试过很多不同的东西,似乎无法让它发挥作用。输入是“abbcccddddeeeee”,它给出了链接列表a,b,c,d,e,其频率分别为1,2,3,4,5。

出于某种原因,它似乎根据我运行的许多不同测试给出了以下树:

                  f15
                 /   \
                f6   f9
               /  \
              d4  e5
             /  \
           f3    c3
          /  \
         a1  b2

public static HTree createHuffmanTree(HLinkedList list)
{
    while (list.size() != 1)
    {
    list = getSortedLinkedList(list);
    HTreeNode p = list.head;
    HTreeNode q = p.next;
    HTreeNode r = new HTreeNode('f');
    r.left = p;
    r.right = q;
    r.frequency = (p.frequency + q.frequency);
    list.insertIntoPosition(r, 2);
    list.remove(0);
    list.remove(0);
    list = getSortedLinkedList(list);
    }
    return new HTree(list.head);
} 

如果有人可以帮助我,那将是非常令人惊讶的,我非常令人难以置信,非常沮丧。

谢谢!

1 个答案:

答案 0 :(得分:3)

问题出在getSortedLinkedList。您似乎正在交换频率值而不是节点本身,因此指针不会随频率值移动。

通常,当您处理链接列表时,绘制每个阶段的图片非常有用:

 a1->b2->c3->d4->e5

第一步:

  f3->c3->d4->e5
  /\
a1  b2

排序:无变化

下一步:

    f6->d4->e5
    /\
  f3  c3
  /\
a1  b2

排序这样做:

    d4->e5->f6 (forgot to move child nodes with frequency)
    /\
  f3  c3
  /\
a1  b2

下一步:

      f9->f6
      /\
    d4  e5
    /\
  f3  c3
  /\
a1  b2

排序:

      f6->f9 (forgetting to move child nodes with frequency)
      /\
    d4  e5
    /\
  f3  c3
  /\
a1  b2

最后一步:

             f15
             /\
           f6  f9
           /\
         d4  e5
         /\
       f3  c3
       /\
     a1  b2