【问题标题】:Huffman Encoding Algorithm giving strange tree (Java)霍夫曼编码算法给出奇怪的树(Java)
【发布时间】:2011-10-05 05:01:32
【问题描述】:

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

不过,由于某种原因,它似乎根据我运行的许多不同测试为我提供了以下树:

                  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);
} 

如果有人能帮助我,那真是太棒了,我非常非常沮丧。

谢谢!

【问题讨论】:

    标签: java algorithm encoding huffman-code


    【解决方案1】:

    问题出在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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多