递归 - >迭代

Recursion -> Iteration

本文关键字:迭代 gt 递归      更新时间:2023-10-16

带有以下trie结构:

struct Trie{
    char letter;
    bool eow;
    Trie *letters[26];
};

我正在使用以下代码以字母顺序从trie中提取矢量的单词。

void getWords(const TrieNode& data, vector<string> &words, string acc)
{
  if (data.eow)
    words.push_back(acc);
  for (int i = 0; i < 26; i++) {
    if (data.letters[i] != NULL)
      getWords(*(data.letters[i]), words, acc + data.letters[i]->letter);
  }
}

我只是想知道是否有没有递归而只使用迭代的方法?我正在尝试仅使用迭代来实现此功能,但无法想到一种使用循环检查Trie中每一层的每一层字母的方法。有任何建议吗?

struct State {
  const TrieNode* data;
  string acc;
  int index;
  State( ... ): ... {} // element-wise constructor, left as an exercise
};
std::vector<string> getWords( const TrieNode* root )
{
  std::vector<string> retval;
  std::vector<State> states;
  states.push_back( State( root, string(), 0 ) );
  while (!states.empty())
  {
    State s = states.back();
    states.pop_back();
    if (s.data->eow)
    {
      retval.push_back( s.acc );
      continue;
    }
    if (s.index >= 26)
      continue;
    states.push_back( State( s.data, s.acc, s.index+1 ) );
    if (s.letters[s.index])
    {
      states.push_back( State( s.letters[s.index], s.acc + s.letters[s.index]->letter, 0 ) );
    }
  }
  return std::move(retval);
};

状态是一个明确的堆栈,它几乎可以跟踪与您递归跟踪相同的数据。我想我设法以相同的顺序访问了元素,这并不重要。

请注意,上述代码是编写的,未测试,您必须为状态编写一个元素构造函数,因为我很懒惰。