我正在实现一个遍历trie的方法(更具体地说,我正在尝试计算叶子节点的数量。进入这些叶子节点的边缘都有一个终止符号'#')。
我正在使用Java,并且在使用此方法时出现错误:
public int traverse(Node n){
for(int i=0; i<n.getNumEdges(); i++){
if(n.getEdgeChar(i) == '#'){
return 1;
}
else{
return traverse((n.getEdge(i)).getNode());
}
}
}
我明白为什么我会收到此错误,但我该如何解决?最初,我认为最好将noLeaves
作为参数传递,但经过一些研究后我发现上面的代码被认为是更好的做法。我只是不知道如何解决这个编译错误。任何帮助将不胜感激!
答案 0 :(得分:2)
可能存在n.getNumEdges()
等于0
并且for
语句不会执行的情况。您应该返回默认值
return 0;
如果此类行为被视为非法,则抛出异常:
throw new IllegalArgumentException("There are no edges in the node!");
答案 1 :(得分:1)
我在这里猜一点,但我认为以下是你的意图?
public int traverse(Node n){
int numOfLeaves = 0;
for (int i=0; i<n.getNumEdges(); i++) {
if(n.getEdgeChar(i) == '#') { // leaf
numOfLeaves += 1;
}
else {
numOfLeaves += traverse((n.getEdge(i)).getNode());
}
}
return numOfLeaves;
}
这将对所有边的递归调用的结果求和并返回总和。假设#
表示一个叶子,并且在总和中计为1,而不是进行递归调用。
答案 2 :(得分:0)
当您声明函数返回任何值(在您的情况下为int)时,它必须在代码末尾返回任何整数。在您的方法中,函数可能不会返回节点为空或为空的任何内容。
要纠正错误,请对您的代码进行以下更改
public int traverse(Node n){
int returnValue=-1;
for(int i=0; i<n.getNumEdges(); i++){
if(n.getEdgeChar(i) == '#'){
returnValue=1;
break;
/*return 1;*/
}
else{
returnValue=traverse((n.getEdge(i)).getNode());
break;
/*return */
}
}
return returnValue;
}