-1

ハフマン ツリーと文字があり、ハフマン ツリー内でのその文字のエンコーディングを返す必要があります。

幅優先走査法を使用して実装しました。左右のツリーをチェックするたびに、ツリーのデータが探している文字と等しいかどうかをチェックしています。ただし、右または左に移動するたびに、これまでのエンコーディングに 0 または 1 を追加します。最終的に、ツリーのデータと等しい文字が見つかったら、そのツリーのエンコーディング値を返します。

コード:

    public static String findCharEncoding(BinaryTree<CharProfile> bTree, char character) {
        Queue<BinaryTree<CharProfile>> treeQueue = new LinkedList<BinaryTree<CharProfile>>();

        // Create a TreeWithEncoding object from the given arguments and add it to the queue
        treeQueue.add(bTree);

        while (!treeQueue.isEmpty()) {
            BinaryTree<CharProfile> t = treeQueue.remove();

->          if (t.getLeft().getData().getCharacter() == character) {
                return t.getLeft().getData().getEncoding();
            }
            if (t.getLeft() != null) {
                t.getLeft().getData().setEncoding(t.getLeft().getData().getEncoding() + "0");
                treeQueue.add(t.getLeft());
            }

            if (t.getRight().getData().getCharacter() == character) {
                return t.getRight().getData().getEncoding();
            }
            if (t.getRight() != null) {
                t.getRight().getData().setEncoding(t.getRight().getData().getEncoding() + "1");
                treeQueue.add(t.getRight());
            }
        }

        // If it gets to here, the while loop was unsuccessful in finding the encoding
        System.out.println("Unable to find.");
        return "-1";
    }

私は次のように実装しました:

        for (int i = 0; i < charOccurrences.size(); i++) {
            char character = charOccurrences.get(i).getCharacter();

            charOccurrences.get(i).setEncoding(findCharEncoding(huffmanTree, character));
            System.out.println(charOccurrences.get(i).getEncoding());
        }

CharProfile は、文字値、文字の確率、およびエンコーディングを保持するカスタム クラスです。

if (t.getLeft().getData().getCharacter() == character) {矢印で示した行で NullPointerExceptionError を返し続けます。いろいろ試してみたのですが、原因がわかりません。

4

2 に答える 2

1

tisnullまたはreturnまたはt.getLeft()returnsのいずれかです。表示されているコードのみが表示されるため、それをデバッグするのはあなたの仕事です。nullt.getLeft().getData()null

これをエラーの上に 1 行挿入できます。

if (t == null) {
    System.out.println("t = null");
} else if (t.getLeft() == null) {
    System.out.println("t.getLeft() returns null");
} else if (t.getLeft().getData() == null) {
    System.out.println("t.getLeft().getData() returns null");
}
于 2012-11-05T15:44:21.493 に答える