字典树(Trie)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。
每个节点有26个子节点,子节点的序号分别代表26个字母。
因此,从根节点到某个节点的路径表示一个字符串。
有时候,每个节点会有一个标记,用于表示是否为一个字符串的结束。
如果一个节点的标记为true,那么从根节点到该节点的路径表示的字符串就是一个单词。
C++示例
以下是一个简单的C++实现,支持插入、搜索和前缀搜索。
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 43 44 45 46 47 48
| class Node { public: int end; vector<unique_ptr<Node>> son; Node():end(0),son(26){}; };
class Trie { public: unique_ptr<Node> root; Trie() { root=make_unique<Node>(); } void insert(string word) { Node* cur=root.get(); for(auto chr: word){ if(cur->son[chr-'a']==nullptr) cur->son[chr-'a']=make_unique<Node>(); cur=cur->son[chr-'a'].get(); } cur->end=1; } bool search(string word) { Node* cur = root.get(); for (char c : word) { c -= 'a'; if (cur->son[c] == nullptr) { return false; } cur = cur->son[c].get(); } return cur->end==1; } bool startsWith(string prefix) { Node* cur = root.get(); for (char c : prefix) { c -= 'a'; if (cur->son[c] == nullptr) { return false; } cur = cur->son[c].get(); } return true; } };
|