我有一个名为TrieNode的类,它有一个char键和triNode的arrayList。我正在尝试实现一个特里。
结构:
例如,根键是'。'孩子们是t,o,s和p。对于具有键's'的节点,子节点为t和p。我想计算trie中的节点数。我用过这个算法
public int size(TrieNode tmp, int n){
if(tmp.children.isEmpty()){
return 0;
}
for(int i=0;i<tmp.children.size();i++){
return 1 + size(tmp.children.get(i), n);
}
return 1;
}
问题是我并不是每次通话都是唯一的。所以这个方法在根上调用然后是子项t然后是t然后是o直到p。当它再次返回s时,它不会调用p上的方法。
如何解决这个问题?
答案 0 :(得分:1)
问题是你退出第一个元素的循环。如果要对所有元素求和,则需要在返回父级之前对递归结果求和。
public int size(TrieNode tmp, int n){
int sum = 0;
for(int i=0;i<tmp.children.size();i++){
sum += size(tmp.children.get(i), n);
}
if(/* node has char n */){
return sum + 1;
}
return sum ;
}
答案 1 :(得分:0)
对此算法使用 DFS 。您访问的每个节点都是子节点。在访问该子节点后总结计数。做这样的事情..
//the root is the first node to be passed on.**
void size(TrieNode node){
if(node is null) return;
if(node is not null) result.add(node);
while(there exist childNode in node){
size(childNode);
}
}
Result是一个包含树的所有节点的ArrayList。 result.size()
为您提供树中的节点数。