我有一个TrieNode类定义如下:
class TrieNode {
public:
map<char, TrieNode*> children;
bool isLeaf = false; // if node represents end of word
int wordCount = 0; // How many times the word appears
TrieNode();
};
我正在尝试打印出trie中的所有单词(最好按字母顺序排列,尽管此时我已经满足于此)。我一直在尝试实现一个递归解决方案,但我还没能做出一个像样的开始。
编辑:我应该提一下我所看到的所有其他问题,如何将trie中的所有单词作为数组存储,而不是地图。
答案 0 :(得分:1)
这是深度优先的递归遍历。
最好不要使用原始指针,但我在这里做了因为你问我喜欢你。
我没有删除AddTrie
分配的子节点,因为我只想演示遍历,而不是编写整个实现。
因此,如果您使用此代码,则需要添加代码以删除它们。
#include <iostream>
#include <map>
#include <string>
class TrieNode {
public:
std::map<char, TrieNode*> children;
bool isLeaf = false; // if node represents end of word
int wordCount = 0; // How many times the word appears
TrieNode() {}
};
void AddTrie(TrieNode& trie, const char* word) {
auto c = *(word++);
auto next = trie.children[c];
if(!next) { trie.children[c] = next = new TrieNode; }
if(*word) { AddTrie(*next, word); }
else { next->isLeaf = true; }
}
void DumpTrie(const TrieNode& trie, std::string word={}) {
for(const auto& child : trie.children) {
const auto next_word = word + child.first;
if(child.second->isLeaf) { std::cout << next_word << '\n'; }
DumpTrie(*child.second, next_word);
} }
int main() {
TrieNode trie;
AddTrie(trie, "goodbye");
AddTrie(trie, "hello");
AddTrie(trie, "good");
AddTrie(trie, "goodyear");
DumpTrie(trie);
}
输出
good
goodbye
goodyear
hello
答案 1 :(得分:0)
我假设您希望通过使用地图来减少每个节点中26个插槽阵列的内存消耗?但是看看地图初始建设成本如何相当高,您可能希望为所有节点使用相互映射,而不是在每个节点中存储一个。