使用 Huffman 树解码消息
Posted
技术标签:
【中文标题】使用 Huffman 树解码消息【英文标题】:Decoding a message with Huffman tree 【发布时间】:2012-11-19 23:32:26 【问题描述】:当我发送一串要解码的位时,似乎需要一个额外的位才能正确解码。我已经预先打印出了这棵树,我已经在纸上画了这棵树,以确保我没有遗漏任何东西。预购和我绘制的树匹配,但生成正确字母所需的位已关闭。
public void decode(String code)
String result = "";
TreeNode current = root;
current.preOrder();
for(int i = 0;i < code.length();i++)
//left--0
if(Character.getNumericValue(code.charAt(i))==0)
if(current.getLeft() == null)
result += current.getWeight().getLetter();
current = root;
i--;
else
current=current.getLeft();
//right--1
else if(Character.getNumericValue(code.charAt(i))==1)
if(current.getRight() == null)
result += current.getWeight().getLetter();
current = root;
i--;
else
current=current.getRight();
System.out.println(result);
我的树每次都正确构建,这让我相信错误出在解码方法中。但是,我似乎无法弄清楚为什么它需要额外的位。
【问题讨论】:
【参考方案1】:没有看到您的节点是如何布置的,我只能猜测。当向左/向右遍历时,您可能需要检查您是否已降落在叶节点上,如果是,则发出其字符。
if (current.getLeft() == null)
...
else
current = current.getLeft();
if (current.isLeaf())
result += current.getWeight().getLetter();
current = root;
右侧也是如此。
不要重复自己
为避免重复附加字符的两行并将当前节点重置为根四次,您可以设置一个标志并在 for
块的末尾检查它。
boolean append = false;
if (Character.getNumericValue(code.charAt(i)) == 0)
if (current.getLeft() == null)
append = true;
i--;
else
current = current.getLeft();
if (current.isLeaf())
append = true;
// same for right side ...
if (append)
result += current.getWeight().getLetter();
current = root;
其他提示
从两个if
检查0
或1
切换到一个switch
,其中default
抛出一个IllegalArgumentException
。
将 for
循环切换到 while
以避免预先递减 i
只是为了让它再次递增并避免停止循环。
从 append
开始设置为 true
,因为六分之四的情况附加。
【讨论】:
以上是关于使用 Huffman 树解码消息的主要内容,如果未能解决你的问题,请参考以下文章