给出奇异树的哈夫曼编码算法(Java)
我在这里尝试了很多不同的东西,但似乎都没能成功。输入是“abbccddddeeee”,它给出了一个链表a、b、c、d、e,频率分别为1、2、3、4、5 然而,出于某种原因,基于我运行的许多不同测试,它似乎给出了以下树:给出奇异树的哈夫曼编码算法(Java),java,algorithm,encoding,huffman-code,Java,Algorithm,Encoding,Huffman Code,我在这里尝试了很多不同的东西,但似乎都没能成功。输入是“abbccddddeeee”,它给出了一个链表a、b、c、d、e,频率分别为1、2、3、4、5 然而,出于某种原因,基于我运行的许多不同测试,它似乎给出了以下树: f15 / \ f6 f9 / \ d4 e5 / \ f
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);
}
如果有人能帮我,我会非常非常非常沮丧
谢谢大家! 问题出在
getSortedLinkedList
中。看起来您正在交换频率值,而不是节点本身,因此指针不会随频率值一起移动
通常,在处理链表时,绘制每个阶段的图片非常有用:
a1->b2->c3->d4->e5
第一步:
f3->c3->d4->e5
/\
a1 b2
排序:无变化
下一步:
f6->d4->e5
/\
f3 c3
/\
a1 b2
f9->f6
/\
d4 e5
/\
f3 c3
/\
a1 b2
排序是这样做的:
d4->e5->f6 (forgot to move child nodes with frequency)
/\
f3 c3
/\
a1 b2
下一步:
f6->d4->e5
/\
f3 c3
/\
a1 b2
f9->f6
/\
d4 e5
/\
f3 c3
/\
a1 b2
排序:
最后一步:
f15
/\
f6 f9
/\
d4 e5
/\
f3 c3
/\
a1 b2