StackOverFlow错误/无休止的递归

时间:2012-12-07 19:42:02

标签: java recursion stack-overflow

我正在编码一个霍夫曼编码的树,我收到了错误。

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()上有一个无限的重复方法。但是,我不明白它在做什么。

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

任何见解都会非常感激,因为我已经有一段时间了,我很沮丧。

2 个答案:

答案 0 :(得分: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(" ");

答案 1 :(得分:0)

在setParent(右边的HuffmanNode)你做这个.left = left,什么都没做。这一定是你的错误