2012-10-27 140 views
1

用下面Trie树结构:递归 - >迭代

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

我使用以下代码来提取一个线索字转换为按字母顺序的载体。

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中每个图层的每个字母的方法。有什么建议么?

+1

如果问题真的只是“有没有办法做到这一点没有递归?”当然是的。如果你问“我该怎么做?”那么简短的答案就是使用堆栈。 –

+0

你可以添加语言标签吗?例如[tag:c]或[tag:C++] – Bohemian

+0

您至少可以发布一个希望编译的结构定义。 – Puppy

回答

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

这些状态是一个显式堆栈,跟踪递归跟踪的相同数据,非常多。我想我设法按照递归函数的顺序访问元素,但这并不重要。

请注意,上面的代码是写入并未经过测试,并且您必须为状态编写一个元素明确的构造函数,因为我很懒。

+0

有没有办法做到像一个循环在一个循环?或者你建议我做一个国家班/结构 –

+0

我建议你做一个明确的堆栈。您可以在堆栈中获得更少的细节,并且甚至可以使用acc字符串作为堆栈。我不会推荐它。 – Yakk