HuffmanCode Java 实例变量分配了一棵树,保持为空
HuffmanCode Java instance variable assigned a tree, remains empty
我正在编写用于创建 HuffmanCode 程序的遍历方法,但出于某种原因,我在遍历方法中构建的映射不会分配给实例变量 codeMap
。我已经在控制台中测试了带有字符串输出的方法的过程 - traversal
正确构建了 tree
,但是当我分配
`codeMap = traversal(root,s);`
在我的构造函数中,codeMap 仍然是空的; returns true
当我测试
`codeMap.isEmpty()`.
为什么 codeMap
不接受返回的地图?我正在使用的 root
变量 freqMap
和 PriorityQueue 在构造函数中也能正常工作。这是我的 constructor/instance 变量:
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);
}
和我的 traversal
方法:
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()
的每个条目中,您都会创建一个新的 tree
。返回到初始调用方法的唯一一个将始终为空,因为在该级别该节点永远不会是叶节点。
您必须将树实例化一次并将其作为参数传递给递归方法。
我正在编写用于创建 HuffmanCode 程序的遍历方法,但出于某种原因,我在遍历方法中构建的映射不会分配给实例变量 codeMap
。我已经在控制台中测试了带有字符串输出的方法的过程 - traversal
正确构建了 tree
,但是当我分配
`codeMap = traversal(root,s);`
在我的构造函数中,codeMap 仍然是空的; returns true
当我测试
`codeMap.isEmpty()`.
为什么 codeMap
不接受返回的地图?我正在使用的 root
变量 freqMap
和 PriorityQueue 在构造函数中也能正常工作。这是我的 constructor/instance 变量:
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);
}
和我的 traversal
方法:
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()
的每个条目中,您都会创建一个新的 tree
。返回到初始调用方法的唯一一个将始终为空,因为在该级别该节点永远不会是叶节点。
您必须将树实例化一次并将其作为参数传递给递归方法。