我正在实施一个trie到implmenta拼写字典。 trie的基本元素是一个三元组,它由一个字母部分(char),一个标志(这个字符是否是一个单词的最后一个字符)和一个包含26个指针的数组组成。
TrieNode类的私有部分包括:
ItemType item;//char
bool isEnd;//flag
typedef TrieNode* TrieNodePtr;
TrieNodePtr myNode;
TrieNodePtr array[26];//array of pointers
这是测试电话的一部分:
Trie t4 = Trie();
t4.insert("for");
t4.insert("fork");
t4.insert("top");
t4.insert("tops");
t4.insert("topsy");
t4.insert("toss");
t4.print();
cout << t4.wordCount() << endl;
现在我试图遍历trie来计算有多少个单词(有多少个标志设置为true)。
size_t TrieNode::wordCount() const{
for (size_t i = 0; i < 26; i++){
if (array[i] == nullptr){
return 0;
}
if (array[i]->isEnd && array[i] != nullptr){
cout << "I'm here" << endl;
return 1 + array[i]->wordCount();
}
else if(!array[i]->isEnd && array[i]!=nullptr){
cout << "I'm there" << endl;
return 0 + array[i]->wordCount();
}
else{
// do nothing
}
}
}
每次函数返回0.我知道它是因为当数组中的第一个元素为null时,函数退出,因此计数总是为0.但我不知道如何避免这种情况,因为每次我都从第一个指针开始。我也收到警告:并非所有控制路径都返回一个值。我不知道这是从哪里来的。如果当前指针为空,如何使函数继续到数组中的下一个指针?有没有更有效的方法来计算单词?谢谢!
答案 0 :(得分:0)
这是一种简单明了的方法(使用深度优先搜索):
size_t TrieNode::wordCount() const {
size_t result = isEnd ? 1 : 0;
for (size_t i = 0; i < 26; i++){
if (array[i] != null)
result += array[i]->wordCount();
return result;
}