java - HuffmanCode Java实例变量分配了一棵树,保持为空

标签 java dictionary huffman-code

我正在编写一个用于创建 HuffmanCode 程序的遍历方法,由于某种原因,我在遍历方法中构建的 map 不会分配给实例变量 codeMap。我已经在控制台中使用字符串输出测试了方法的流程 - 遍历正确构建了树,但是当我分配时

`codeMap = traversal(root,s);`

在我的构造函数中,codeMap 保持为空;当我测试

时返回 true
`codeMap.isEmpty()`. 

为什么codeMap不接受返回的 map ?我使用的 root 变量 freqMap 和 PriorityQueue 在构造函数中也能正常工作。这是我的构造函数/实例变量:

TreeNode root;
Map<Character,String> codeMap;
Map<Character,Double> freqMap;
HuffmanCode(Map<Character,Double> freqMap){
   this.freqMap = freqMap;
   PriorityQueue<TreeNode> queue = new PriorityQueue<TreeNode>(new NodeComparator());
   for(Map.Entry<Character,Double> entry : freqMap.entrySet()){
     TreeNode temp = new TreeNode(entry.getKey(),entry.getValue());
     queue.add(temp);
   }
   while(queue.size() > 1){
     TreeNode t1 = queue.remove();
     TreeNode t2 = queue.remove();
     TreeNode node = new TreeNode(t1.freq + t2.freq, t1, t2);
     queue.add(node);
   }
   root = queue.remove();
   String s = ""; 
   codeMap = traversal(root,s);
}

和我的遍历方法:

public Map<Character,String> traversal(TreeNode node, String s){
  Map<Character,String> tree = new TreeMap<Character,String>();
  if(!node.isLeaf()){
    traversal(node.left,s+"0");
    traversal(node.right,s+"1");
  }else{
    tree.put(node.letter,s);
  }
  return tree;
}

我在编译或运行时没有收到任何错误。如果需要 main 方法,请告诉我,但问题出在这个构造函数上。我已经连续工作了几个小时,但找不到 codeMap 仍然为空的原因...

最佳答案

traversal() 的每个入口处,您都会创建一个新的。返回到初始调用方法的唯一一个将始终为空,因为在该级别该节点永远不会是叶节点。

您必须实例化树一次并将其作为参数传递给递归方法。

关于java - HuffmanCode Java实例变量分配了一棵树,保持为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34168975/

相关文章:

java - 等价于 Java 中的 await(x==0)

java - 领域驱动设计中的实体

java - 如何以相反的顺序对 guava Multimap 键进行排序?

python - 列表字典的笛卡尔积 - 带排序

python - Python 中的嵌套默认值

java - 如何将两个改造请求中的数据传递到单个 recyclerview 适配器

java - 开关盒不适用于菜单项 - 为什么?

Java Huffman树代码 "Decode"方法不起作用

java - 如何最好地搜索可变长度位串的二进制数据?

java - 如何在控制台中显示霍夫曼树?