2014-11-15 3 views
1

Я внедряю словарь для написания трии к импментам. Основным элементом trie является триенкод, состоящий из части письма (char), флага (является ли этот символ последним символом слова) и массивом из 26 указателей.Подсчитайте слово в реализации trie

Частная часть класса 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; 

Сейчас я пытаюсь пройти через синтаксического дерева, чтобы подсчитать, сколько слов (сколько флагов установлено в 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. Я знаю, что это потому, что, когда первый элемент массива имеет нулевое значение, то функция завершается, поэтому отсчет всегда равен 0. Но я не знаю, как избежать этого , так как каждый раз, когда я начинаю с первого указателя. Я также получаю предупреждение: не все пути управления возвращают значение. Я не уверен, откуда это взялось. Как заставить функцию перейти к следующему указателю в массиве, если текущий указатель равен NULL? Есть ли более эффективный способ подсчета слов? Спасибо!

+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 и как вы отслеживаете счет, используя «результат». Не могли бы вы вкратце объяснить, что вы делаете с '? 1: 0' здесь? Я довольно новичок в C++. Спасибо за помощь! – HoneyWine

+0

@ user3896999 'result = isEnd? 1: 0; 'означает' if (isEnd) result = 1; else result = 0'. – kraskevich

+0

@ user2040251Ah я вижу. Очень хороший ярлык. Спасибо! Спасибо! – HoneyWine

Смежные вопросы