谁能告诉我为什么我的这个霍夫曼编码算法的代码会产生错误?

时间:2012-11-06 03:18:37

标签: java binary-tree breadth-first-search huffman-code

我有一个霍夫曼树和一个角色,我想要返回该角色在霍夫曼树中的编码应该是什么。

我使用广度优先遍历方法实现了它,每次我检查左右树时,我都在检查树的数据是否等于我正在寻找的字符。但是,每次我向右或向左移动时,我都会向编码添加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,我用箭头表示。我已经尝试过,但我似乎无法弄明白为什么,除了t.getLeft().getData()返回错误的事实,而不是整个事情,或t.getLeft(),但我仍然可以找不出原因。

1 个答案:

答案 0 :(得分:1)

如果左侧或右侧树枝实际上可以是null - 如果这是Huffman,那么它应该只发生在叶节点上 - 为什么要在它们上面调用getData < em>之前你检查?这肯定会导致NullPointerExeption。

if (t.getLeft() != null) {
  // check nullity and THEN check match
  if (t.getLeft().getData().getCharacter() == character) {
    return t.getLeft().getData().getEncoding();
  }
  t.getLeft().getData().setEncoding(t.getLeft().getData().getEncoding() + "0");
  treeQueue.add(t.getLeft());
}

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

P.S。如果否则返回0 s和1 s的位串,您也可能希望避免返回“-1”,并且每次findCharEncoding时都避免设置树节点的编码,但这只是一个疯狂的猜测。 :)