使用 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 检查01 切换到一个switch,其中default 抛出一个IllegalArgumentException。 将 for 循环切换到 while 以避免预先递减 i 只是为了让它再次递增并避免停止循环。 从 append 开始设置为 true,因为六分之四的情况附加。

【讨论】:

以上是关于使用 Huffman 树解码消息的主要内容,如果未能解决你的问题,请参考以下文章

Huffman编码和解码

DS二叉树——Huffman编码与解码(不含代码框架)

对一串字符进行huffman编码并解码

基于Huffman编码的文件压缩项目

基于Huffman编码的文件压缩项目

h5房卡源码C语言实现哈夫曼树编码解码及问题总结