C ++深度优先使用前缀参数搜索Trie

时间:2017-04-23 03:13:35

标签: c++ dictionary data-structures trie

我试图实现一个可以打印出具有给定前缀的单词频率的trie。

编辑:感谢@ kaidul-islam发现我的错误并出现以下错误:

new_word->child[letter]->prefixes_++;

以下是固定代码:

Trie Class:

class Trie
{
public:
    Trie(): prefixes_(0), is_leaf_(false), frequency_(0)
    {
        for (int i=0; i<26; i++)
        {
            child[i] = nullptr;
        }
    }
    virtual ~Trie();

    //Child nodes of characters from a-z
    Trie *child[26];
    //vector<Trie> child;

    int prefixes_;

    //accessor & mutator functions
    bool GetIsLeaf() { return is_leaf_; }
    void SetIsLeaf(bool val) { is_leaf_ = val; }
    int GetFrequency() { return frequency_; }
    void SetFrequency(int val) { frequency_ = val; }
    int GetPrefixes() { return prefixes_; }
    void SetPrefixes(int val) { prefixes_ = val; }
    bool is_leaf_;

private:
    //bool is_leaf_;
    int frequency_;
};

问题中的功能:

void AddWord(string &word, Trie *root)
{
    Trie *new_word = root;
    new_word->prefixes_++;
    for(unsigned int i = 0 ; i < word.length(); i++)
    {
        int letter = (int)word[i] - (int)'a';   //extract character of word
        if(new_word->child[letter] == nullptr)
        {
            new_word->child[letter] = new Trie;
        }

        /*cout << "not value of x: " << new_word->child[letter]->GetPrefixes() << endl;
        int x = (new_word->child[letter]->GetPrefixes())+1;
        cout << "value of x: " << x << endl;
        new_word->child[letter]->SetPrefixes(x);*/
        new_word->child[letter]->prefixes_++;

        new_word = new_word->child[letter];
    }
    new_word->SetFrequency(new_word->GetFrequency()+1);
    /*
    cout << "Word: " << word << endl;
    cout << "frequency: " << new_word->GetFrequency() << endl;
    cout << "prefixes: " << new_word->GetPrefixes() << endl;
    cout << "is leaf: " << new_word->GetIsLeaf() << endl << endl;
    */
}

1 个答案:

答案 0 :(得分:1)

经过快速检查后,我发现你没有在构造函数中初始化成员变量。

Trie(): prefixes_(0),
        is_leaf_(false),
        frequency_(0) {

    for(int i = 0; i < 26; i++) {
        child[i] = nullptr;
    }
}

与全局变量不同,无法保证prefixes_在声明时默认为0。并且child[i]也不能保证nullptr。你需要初始化一切。