打印使用地图

时间:2017-04-07 20:24:15

标签: c++ data-structures trie

我有一个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中的所有单词作为数组存储,而不是地图。

2 个答案:

答案 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个插槽阵列的内存消耗?但是看看地图初始建设成本如何相当高,您可能希望为所有节点使用相互映射,而不是在每个节点中存储一个。