我编写的代码应该能够返回我的霍夫曼树中代码的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中。关于什么可能出错的任何建议?
答案 0 :(得分:0)
有两个问题:
getLeft
不是null
,则traverse不会调查getRight
traverse
或getLeft
不为空时,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)
)