2012-12-07 37 views
0

我正在编码huffman encodoing树,我得到错误。StackOverFlow错误/无止境递归

5:1 
5:4 
5:2 
5:1 
5:4 
5:2 
5:1 
5:4 
5:2 
5:1 
Exception in thread "main" java.lang.StackOverflowError 
at sun.nio.cs.SingleByteEncoder.encodeLoop(SingleByteEncoder.java:130) 
at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:544) 
at sun.nio.cs.StreamEncoder.implWrite(StreamEncoder.java:252) 
at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:106) 
at java.io.OutputStreamWriter.write(OutputStreamWriter.java:190) 
at java.io.BufferedWriter.flushBuffer(BufferedWriter.java:111) 
at java.io.PrintStream.write(PrintStream.java:476) 
at java.io.PrintStream.print(PrintStream.java:619) 
at java.io.PrintStream.println(PrintStream.java:756) 
at HuffmanNode.buildTree(hw4.java:65) 
at HuffmanNode.buildTree(hw4.java:66) 
at HuffmanNode.buildTree(hw4.java:66) 
at HuffmanNode.buildTree(hw4.java:66) 
at HuffmanNode.buildTree(hw4.java:66) 

很明显,我在buildTree()有一个无限的recusive方法。但是,我不明白它在做什么。

public void buildTree(HuffmanNode node){ 
    if (node.compareTo(this) <= 0 && left != null){ 
    System.out.println(node.getCount() + ":" + this.count); 
    left.buildTree(node); 
    } 
    else if (node.compareTo(this) <= 0 && left == null){ 
    this.left = node; 
    node.parent = this; 
    } 
    else if (node.compareTo(this) > 0 && right != null){ 
    System.out.println(node.getCount() + ":" +this.count); 
    right.buildTree(node); 
    } 
    else if (node.compareTo(this) > 0 && right == null){ 
    this.right = node; 
    node.parent = this; 
    } 
} 

我完整的代码和输入的文件可以看出Here

任何有识之士将不胜感激,因为我一直在这一段时间,感到很沮丧。

+0

更新,以便引擎收录代码行匹配的错误 – user1093111

+1

你有递归函数中的停止条件? –

+0

好吧,它应该是在156 - 160下。如果它达到根值,那么根=结果,然后我会使用root.genCode()打印二进制文件。但是我的逻辑可能是错的。 – user1093111

回答

0

在的setParent(HuffmanNode右)你做this.left =左边这也绝对没有什么。这一定是你的错误

+0

这种方法在代码 – hoaz

+0

ha,whoops的任何地方都没有使用。一定是我以前想法的一部分。 – user1093111

1

第一步后,你的树是这个样子:

root 
/\ 
    - 
/\ 
    M Z 

当你做第二步,附加新result节点Z,这是不对的。第二步之后,你的树被破坏,第三步进入无限递归。

编辑:好吧,我刚才读的算法再次,我认为你需要做的是创造的结果节点。只是删除这些行:

 if (root == null) { 
      root = result; 
     } else { 
      root.buildTree(result); 
     } 

然后当你的循环结束,你将有只有一个节点在huffmanList,这是root

while (huffmanList.size() > 1) { 
     HuffmanNode x = huffmanList.poll(); 
     HuffmanNode y = huffmanList.poll(); 
     HuffmanNode result = new HuffmanNode("-", x.getCount() + y.getCount(), null, x, y); 
     huffmanList.add(result); 
    } 
    huffmanList.poll().genCode(" ");