# 实现 Trie (前缀树)

Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。

请你实现 Trie 类:

 

示例:

输入
["Trie", "insert", "search", "search", "startsWith", "insert", "search"]
[[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]]
输出
[null, null, true, false, true, null, true]

解释
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple");   // 返回 True
trie.search("app");     // 返回 False
trie.startsWith("app"); // 返回 True
trie.insert("app");
trie.search("app");     // 返回 True

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; ``` ### after ```cpp ``` ## 答案 ```cpp class TrieNode { public: bool end_with; TrieNode *next[26]; TrieNode() { end_with = false; memset(next, 0, sizeof(next)); } }; class Trie { TrieNode root; public: /** Initialize your data structure here. */ Trie() {} /** Inserts a word into the trie. */ void insert(string word) { TrieNode *node = &root; for (int i = 0; i < word.size(); i++) { int c = word[i] - 'a'; node->next[c] = new TrieNode(); node = node->next[c]; } node->end_with = true; } /** Returns if the word is in the trie. */ bool search(string word) { TrieNode *node = &root; for (int i = 0; i < word.size(); i++) { if (node->next[word[i] - 'a'] != NULL) node = node->next[word[i] - 'a']; else return false; } return (node->end_with) ? true : false; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) { TrieNode *node = &root; for (int i = 0; i < prefix.size(); i++) { if (node->next[prefix[i] - 'a'] != NULL) node = node->next[prefix[i] - 'a']; else return false; } return true; } }; ``` ## 选项 ### A ```cpp struct TrieNode { bool isEnd = false; TrieNode *children[26] = {NULL}; }; class Trie { public: Trie() : root(new TrieNode) {} void insert(string word) { TrieNode *p = root; for (int i = 0; i < word.size(); ++i) { int idx = word[i] - 'a'; if (p->children[idx] == NULL) p->children[idx] = new TrieNode; p = p->children[idx]; } p->isEnd = true; } bool search(string word) { auto p = root; for (int i = 0; i < word.size(); ++i) { int idx = word[i] - 'a'; if (p->children[idx] == NULL) return false; p = p->children[idx]; } return p->isEnd; } bool startsWith(string prefix) { auto p = root; for (int i = 0; i < prefix.size(); ++i) { int idx = prefix[i] - 'a'; if (p->children[idx] == NULL) return false; p = p->children[idx]; } return true; } private: TrieNode *root; }; ``` ### B ```cpp struct TrieNode { const static int MaxBranchNum = 26; char data; bool isEnd = false; vector children = vector(26); TrieNode(char data) : data(data){}; }; class Trie { public: Trie() : root(new TrieNode('/')) {} void insert(string word) { TrieNode *p = root; for (int i = 0; i < word.size(); ++i) { int idx = word[i] - 'a'; if (p->children[idx] == NULL) p->children[idx] = new TrieNode(word[i]); p = p->children[idx]; } p->isEnd = true; } bool search(string word) { auto p = root; for (int i = 0; i < word.size(); ++i) { int idx = word[i] - 'a'; if (p->children[idx] == NULL) return false; p = p->children[idx]; } return p->isEnd; } bool startsWith(string prefix) { auto p = root; for (int i = 0; i < prefix.size(); ++i) { int idx = prefix[i] - 'a'; if (p->children[idx] == NULL) return false; p = p->children[idx]; } return true; } private: TrieNode *root; }; ``` ### C ```cpp struct Node { map next; bool f = false; }; class Trie { public: Node *head; /** Initialize your data structure here. */ Trie() { head = new Node(); } /** Inserts a word into the trie. */ void insert(string word) { Node *t = head; for (char c : word) { if (t->next[c] == NULL) { Node *n = new Node; t->next[c] = n; } t = t->next[c]; } t->f = true; } /** Returns if the word is in the trie. */ bool search(string word) { Node *t = head; for (char c : word) { if (t->next[c] == NULL) { return false; } t = t->next[c]; } return t->f; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) { Node *t = head; for (char c : prefix) { if (t->next[c] == NULL) { return false; } t = t->next[c]; } return true; } }; ```