在trie实现中计算单词

时间:2014-11-15 19:35:59

标签: c++ recursion structure trie

我正在实施一个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.但我不知道如何避免这种情况,因为每次我都从第一个指针开始。我也收到警告:并非所有控制路径都返回一个值。我不知道这是从哪里来的。如果当前指针为空,如何使函数继续到数组中的下一个指针?有没有更有效的方法来计算单词?谢谢!

1 个答案:

答案 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;
}