从Java中获取Huffman树方法的代码

时间:2017-10-23 04:30:52

标签: java huffman-code

我编写的代码应该能够返回我的霍夫曼树中代码的ArrayList。 Code类有一个字符及其相应的编码。在树中,左边缘被指定为0,右边缘被指定为1.我使用两种方法来检索代码。

public ArrayList<Code> getCodes() {
        ArrayList<Code> code = new ArrayList<Code>();
        if (root == null) return null;
        traverse(code, root.left, "0");
        traverse(code, root.right, "1");
        return code;
}


private void traverse(ArrayList<Code> code, BinaryTreeNode<Letter> node, String prefix) {

    if(node==null){
        code.add(new Code(node.getElement().getLetter(), prefix));
    }
    else if (node.getLeft()!=null){
        traverse(code, node.getLeft(), prefix + "0");
    }
    else if (node.getRight()!=null){
        traverse(code, node.getRight(), prefix + "1");
    }

}

但我的输出结果不正确。它应该如下所示,显示我的所有代码:

  

开始

     

代码大小为27

     

代码[ch =,code = 00]

     

代码[ch = e,代码= 010]

     

代码[ch = n,代码= 0110]

     

代码[ch = i,代码= 0111]

     

代码[ch = b,代码= 100000]

     

代码[ch = p,代码= 100001]

     

代码[ch = y,代码= 100010]

     

代码[ch = g,代码= 100011]

     

代码[ch = o,代码= 1001]

     

[...]

但相反,我明白了:

  

开始

     

代码大小为0

似乎我的代码/字符/任何内容都没有保存到我的ArrayList中。关于什么可能出错的任何建议?

1 个答案:

答案 0 :(得分:0)

有两个问题:

  • 如果getLeft不是null,则traverse不会调查getRight
  • 仅当traversegetLeft不为空时,
  • getRight才会进行递归。这意味着您永远不会向null方法发送traverse,但如果code被发送到遍历方法(即从不),则只会向null数组添加结果。< / LI>

遍历方法应该是:

if(node==null){
    code.add(new Code(node.getElement().getLetter(), prefix));
} else {
    traverse(code, node.getLeft(), prefix + "0");
    traverse(code, node.getRight(), prefix + "1");
}

您也可以从traverse(code, root, "");开始(而不是traverse(...left)traverse(...right)

,让代码稍微变得更漂亮(也更短)