尝试只插入单词的第一个字母,而不是整个单词

时间:2019-04-02 22:36:48

标签: c++ insert trie

我目前正在一个程序中,正在向特里插入单词。目前,我的插入功能仅添加单词的第一个字母,然后停止。从我查找的所有内容来看,我的代码看起来都是正确的,所以我不明白问题出在哪里。

我尝试将temp-> wordEnd = true移动到for循环的外部以及函数中的不同位置。因为我相信这是问题所在,因为我插入函数中的所有其他内容都看起来正确。

这是我的插入函数:

bool Trie::insert(string word)
{
    TrieNode *temp = root;
    temp->prefixAmount++;

    for (int i = 0; i < word.length(); ++i)
    {
        int currentLetter = (int)word[i] - (int)'a';
        if (temp->child[currentLetter] == NULL)
        {
            temp->child[currentLetter] = new TrieNode();
            temp->child[currentLetter]->prefixAmount++;
            temp = temp->child[currentLetter];
        }
        temp->wordEnd = true;
        return true;
    }
}

还可以帮助每个人更好地遵循我的代码 这是我的TrieNode结构:

  struct TrieNode
   {
     int prefixAmount;
     struct TrieNode *child[ALPHA_SIZE];
    bool wordEnd;

   };

这是我的Trie构造函数:

   Trie::Trie()
    {
      root = new TrieNode();
      root->wordEnd = false;
     root->prefixAmount = 0;

     }

预期结果是整个单词都被插入。 实际发生的是只添加了单词的第一个字母。

1 个答案:

答案 0 :(得分:1)

我已经为您重新格式化了代码,现在您希望可以看到主要问题。

您将返回for循环中该块的末尾。这将意味着它将运行for循环的第一次迭代,并且仅返回而无需考虑其余字母。

一个简单的解决方法是将return 放在外部 for循环中,但是还有另一个问题,如果当前字母已经在其中,则无法正确更新Trie。您的NULL检查是正确的,但是您只能newNULL 上的TrieNode上移动,但是您也想运行所有后续行,即使它不是NULL < / em>。固定代码如下:

bool Trie::insert(string word)
{
    TrieNode *temp = root;
    temp->prefixAmount++;

    for (int i = 0; i < word.length(); ++i)
    {
        int currentLetter = (int)word[i] - (int)'a';
        if (temp->child[currentLetter] == NULL)
        {
            temp->child[currentLetter] = new TrieNode();
        }
        temp->child[currentLetter]->prefixAmount++;
        temp = temp->child[currentLetter];
    }
    temp->wordEnd = true;
    return true;
}

(代码中问题之外的其他次要问题-首选nullptr胜过NULL,如果您的字符串始终为bool,为什么要返回true包含a-z以外的任何内容,那么您将阅读数组边界之外的内容,而不是原始unique_ptr / make_unqiue,更喜欢newdelete