2014-11-15 48 views
1

我正在实施一个字典实施字典。一个trie的基本元素是一个trienode,它由一个字母部分(char),一个标志(这个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; 

现在我试图穿越线索来算有多少单词是(有多少标志设置为真)。

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。我知道这是因为当数组中的第一个元素为空,则函数退出,因此计数始终为0。但我不知道如何避免这个,因为每次我从第一个指针开始。我也得到一个警告:并不是所有的控制路径都返回一个值。我不确定这是从哪里来的。如果当前指针为空,如何使函数继续到数组中的下一个指针?有没有更有效的方法来计算单词?谢谢!

+0

请出示这件事情是如何被调用,数据初始化等没有足够的情况下在这里。 – OldProgrammer

回答

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; 
} 
+0

非常感谢!我可以理解for循环以及如何使用'result'记录计数。你能简单地解释一下你在'?1:0'在做什么吗?我对C++很陌生。感谢您的帮助! – HoneyWine

+0

@ user3896999'result = isEnd? 1:0;'意味着'if(isEnd)result = 1; else result = 0'。 – kraskevich

+0

@ user2040251Ah我明白了。非常好的捷径。谢谢!谢谢! – HoneyWine