特里树初始化

时间:2018-10-12 16:53:53

标签: c++ trie

我正在使用C ++用字典中的一堆单词构造一个trie树。这是我定义TrieNode并构建树的方式:

struct TrieNode {
    TrieNode *children[26];
    bool isWord;
    TrieNode(): isWord(false) {}  /* to be deleted */
};

void buildTree(TrieNode *root, string word) {
    TrieNode *cur = root;
    for (char c : word) {
        if (!cur->children[c-'a'])
            cur->children[c-'a'] = new TrieNode();
        cur = cur->children[c-'a'];
    }
    cur->isWord = true;
}

这在某些编译器上工作正常,但在其他编译器上却产生一些奇怪的结果。例如,有一次我发现isWord被初始化为152,整个程序崩溃了。我尝试删除代码中上面标记的行,然后事情又解决了。这是怎么回事?

此外,“ new TrieNode()”和“ new TrieNode”之间有什么区别?有时我发现它们也会产生不同的结果。

1 个答案:

答案 0 :(得分:0)

您的代码的问题是,您假定要初始化的成员。不幸的是,this is not true。因此,指向children的指针不一定要初始化为nullptr,这会使您的代码取消引用无效的指针,从而导致未定义的行为(UB)(例如,内存损坏,崩溃等)。

简单的解决方案:

在类中为数组添加默认的初始化程序:

       TrieNode *children[26]{};

Demo

我的建议

  • 使用向量而不是本机数组。它们的默认构造函数确保它们为空。
  • 阅读有关initialisation的这篇文章
  • 进行一些边界检查,因为如果您的数据丢失了一些大写字母,您将超出范围,再一次,UB。