0

ハフマン エンコーディング ツリーをコーディングしていて、このエラーが発生しています。

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;
    }
}

私の完全なコードと入力ファイルは、ここで見ることができます。

4

2 に答える 2

1

最初のステップの後、ツリーは次のようになります。

root
/  \
    -
   / \
  M   Z

result2 番目のステップを実行すると、新しいノードが Z にアタッチされますが、これは間違っています。2 番目のステップの後、ツリーは壊れ、3 番目のステップは無限再帰になります。

編集:わかりました、アルゴリズムをもう一度読んだだけで、結果ノードを作成するだけでよいと思います。これらの行を削除するだけです:

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

次に、ループが終了するとhuffmanList、 にノードが 1 つだけになり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(" ");
于 2012-12-07T20:23:54.127 に答える
0

setParent(HuffmanNode right) では、 this.left=left を実行しますが、これはまったく何もしません。これはあなたのエラーに違いない

于 2012-12-07T20:07:31.790 に答える