C++ 从结构中打印单词

C++ 从结构中打印单词,c++,algorithm,debugging,trie,C++,Algorithm,Debugging,Trie,对于trie的以下结构 struct Trie { bool eow; //when a Trie field isWord = true, hence there is a word char letter; Trie *letters[27]; }; 我试图为自动补全程序创建一个函数,它基本上是在给定特定字符串前缀的trie中打印出单词 以下是我所拥有的: int wordcheck( TrieNode &node ) { if (node.isWor

对于trie的以下结构

struct Trie {

  bool eow; //when a Trie field isWord = true, hence there is a word
  char letter;
  Trie *letters[27];

}; 
我试图为自动补全程序创建一个函数,它基本上是在给定特定字符串前缀的trie中打印出单词

以下是我所拥有的:

int wordcheck( TrieNode &node )
  {
    if (node.isWord == 1) // you have found your word, so return true
      {
        return 1;
      }
    for (int i = 0; i < 26; i++)
      {
        if (node.letters[i] != NULL && wordcheck(*(node.letters[i])))
          {
            return 1;
          }
      }
    return 0;
  }



string find (TrieNode &node, const string &word, string acc)
{
   if (word.length() == 0)
    {
      string x = "";
      if (node.isWord == 1){
      x = " ";
      int check = 1;
      for(int i = 0; i < 26; i++)
        {
          if (node.letters[i] != NULL && wordcheck(*(node.letters[i])))
            {
              x = x + acc; check = 0; break;
            }
        }
      if(check == 1)
        { return x; }
      }
  for (int i = 0; i < 26; i++){
    if (node.letters[i] != NULL &&  wordcheck(*(node.letters[i])))
      {
        char let = (char)(i + (int)'a');
        if (x[x.length() - 1 ] == ' ')
          {
            x = x + acc;
          }
        x = x + node.letters[i]->letter 
              + find(*(node.letters[i]), word, acc + node.letters[i]->letter);
      }
  }
  return x;
    }
 else if (node.letters[word[0] - 'a'] == NULL)
   { return ""; }
 else {
   return word[0] + find(*(node.letters[ word[0] - 'a']), 
                         word.substr(1, word.length()-1), 
                         acc + word[0]);
 }
}
int字检查(三节点和节点)
{
如果(node.isWord==1)//您已经找到了您的单词,那么返回true
{
返回1;
}
对于(int i=0;i<26;i++)
{
if(node.letters[i]!=NULL&&wordcheck(*(node.letters[i]))
{
返回1;
}
}
返回0;
}
字符串查找(三节点和节点、常量字符串和单词、字符串acc)
{
if(word.length()==0)
{
字符串x=“”;
if(node.isWord==1){
x=“”;
整数检查=1;
对于(int i=0;i<26;i++)
{
if(node.letters[i]!=NULL&&wordcheck(*(node.letters[i]))
{
x=x+acc;检查=0;中断;
}
}
如果(检查==1)
{返回x;}
}
对于(int i=0;i<26;i++){
if(node.letters[i]!=NULL&&wordcheck(*(node.letters[i]))
{
char let=(char)(i+(int)'a');
如果(x[x.length()-1]='')
{
x=x+acc;
}
x=x+节点。字母[i]->字母
+查找(*(node.letters[i]),单词,acc+node.letters[i]->letter);
}
}
返回x;
}
else if(node.letters[word[0]-'a']==NULL)
{返回“”;}
否则{
返回字[0]+find(*(node.letters[word[0]-'a']),
word.substr(1,word.length()-1),
acc+字[0]);
}
}
如果我给它一个长前缀,它会打印出比前缀短的单词。我使用了累加递归,我相信有一种更有效的方法。我的问题是,是否有人能让我返回正确的字符串,或者在可能的情况下引导我使用更简单的算法

我试图为自动补全程序创建一个函数,它基本上是在给定特定字符串前缀的trie中打印出单词

我不打算分析你的程序-对我来说,它太复杂了,例如,我不知道
wordcheck
应该做什么?为什么它不是
bool
,而是
int
?您真的需要检查您的子trie是否有单词,您是否真的有没有单词的非空trie

对于first-要打印以给定前缀开头的所有单词,您需要转到所有这些单词开始的节点:

TrieNode* TreeNode::get(std::string word)
{
   TreeNode* retVal = this;
   for (size_t i = 0; i < word.length(); ++i) {
     if (Words[i] < 'a' || words[i] > 'z')
        throw std::runtime_error("Wrong word");
     if (retVal->letters[word[i] - 'a'] != NULL)
         retVal = retVal->letters[word[i] - 'a'];
     else 
         return nullptr;
    }
    return retVal;
} 

请在这里键入URL中的代码。因此,我正在尝试编写print all函数,除了返回一个字符串,我希望该函数在一个大字符串中返回trie中的所有单词。以下是我所拥有的功能,它不起作用,有什么原因吗?与我的版本相比:,但我建议将我的原始功能用于
std::ostringstream
void TreeNode::printAll(std::ostream& os, std::string prefix)
{
   if (isWord)
     os << prefix << "\n";
   for (size_t i = 0; i < 26; ++i) {
     if (retVal->letters[i] != NULL)
         // this recursive call can be replaced with iterative solution with stack
         letters[i]->print(os, prefix + char('a' + i)); 
    }
} 
void TreeNode::printBeginWith(std::ostream& os, std::string prefix)
{
   TreeNode* node = get(prefix);
   if (node)
      node->printAll(os, prefix);
}