我正在实现一种遍历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
作为参数传递,但在进行了一些研究之后,我发现上面的代码被认为是更好的做法。我只是不知道如何解决这个编译器错误。任何帮助将不胜感激!
可能存在n.getNumEdges()
等于0
并且for
语句不会执行的情况。应返回默认值
return 0;
或者如果此类行为被视为非法,则抛出例外:
throw new IllegalArgumentException("There are no edges in the node!");
我在这里有点猜测,但我认为以下是您的意图?
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,而不是执行递归调用。
当你声明你的函数返回任何值(在你的例子中是 int)时,它必须在代码末尾返回任何整数。在您的方法中,函数可能不会返回节点为空或 null 的任何内容。
若要更正错误,请对代码进行以下更改
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;
}