# 实现 Trie (前缀树)

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

请你实现 Trie 类:

示例:

输入 ```json ["Trie", "insert", "search", "search", "startsWith", "insert", "search"] [[], ["apple"], ["apple"], ["app"], ["app"], ["app"], ["app"]] ``` 输出 [null, null, true, false, true, null, true] 解释 ```java 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 ```c #include using namespace std; ``` ### after ```c ``` ## 答案 ```c 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 ```c 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 ```c 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 ```c 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; } }; ```