在cpp中实现trie

问题描述 投票:1回答:1

我想在cpp中实现特里。当我尝试打印出Trie中的所有字符串时,什么也没打印。但是代码已成功编译。我认为我的插入内容有问题。我的猜测是,我应该在某处通过引用,以便确实修改了Trie,但是我不确定问题出在哪里或在哪里。

我的结构:

struct Node {
    unordered_map<char, Node*> children;
    bool completeWord;
};

class Trie {
private:
    Node* root;
    void printAll(Node* tmp);
public:
    Trie();
    void insert(string s);
    void printAll();
};

Trie::Trie() {
    root = new Node();
    root->completeWord = false;
}

方法:

void Trie::insert(string s) {
    Node* p = root;
    for(char c : s) {
        auto m = p->children;
        if(!m.count(c)) {
            Node* n = new Node();
            m.insert(pair<char, Node*>(c,n));
        }
        else
            p = m[c];
    }
    p->completeWord = true;
}

printAll用于调试:

void Trie::printAll() {
    printAll(root);
}

void Trie::printAll(Node* tmp) {
    Node* t = tmp;
    auto m = t->children;
    if(!m.empty()){
        for(auto p : m) {
            cout << p.first << " ";
            printAll(p.second); 
        }
    }
}

测试用例:


int main() {
    Trie* t = new Trie();
    string arr[] = {"abc", "abcd", "lmn", "edf"};
    for(string s : arr) 
        t->insert(s);
    t->printAll();
    return 0;
}
c++ data-structures trie
1个回答
0
投票

由于HitobatCode-Apprentice,我弄清楚了我做错了什么。在我的insert中应为:

void Trie::insert(string s) {
    Node* p = root;
    for(char c : s) {
        auto &m = p->children; //m -> &m
        if(!m.count(c)) {
            Node* n = new Node();
            m.insert(pair<char, Node*>(c,n));
        }
        p = m[c]; //remove else
    }
    p->completeWord = true;
}

m只是以前指向映射对的指针,如果没有&,它将仅更改那些对的副本,而不更改那些对本身。所以我需要通过参考。插入新节点时,p未更新。非常感谢您Hitoba指出来!

© www.soinside.com 2019 - 2024. All rights reserved.