介绍
字典树(Trie),就是像字典一样的树,可用于插入和检索字符串。
假设某字典树只需要存储单词,所有单词均由 26
个小写字母组合而成,那么对于该字典树而言,每个节点都有 27 个域,分别为
26 个子节点(可以为 nullptr
)以及一个布尔标识符,表示是否存在某个单词以该字母结尾。
以下图为例:
![](https://typora-1313035735.cos.ap-nanjing.myqcloud.com/img/2023-07-16-172405.png)
该字典树一共存储了 dog、dot、dig、tea、tease、tease
六个单词,其中黄色的节点表示结束节点。
代码实现
在这里还是以 26 个字母组成的单词为例,给出字典树的代码实现。
使用链式节点的字典树模版
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class Trie { private: std::vector<Trie*> child; bool isEnd;
Trie* searchPrefix(const std::string& prefix) { Trie* p = this; for (char ch : prefix) { p = p->child[ch - 'a']; if (p == nullptr) return nullptr; }
return p; }
public: Trie(): child(26, nullptr), isEnd(false) {} ~Trie() { for (Trie* ct : child) { if (ct != nullptr) { delete ct; ct = nullptr; } } }
void insert(const std::string& word) { Trie* p = this; for (char ch : word) { if (p->child[ch - 'a'] == nullptr) { p->child[ch - 'a'] = new Trie(); } p = p->child[ch - 'a']; } p->isEnd = true; }
bool search(const std::string& word) { Trie* p = searchPrefix(word); return p && p->isEnd; } };
|