LeetCode Implement Trie (Prefix Tree)
Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
题目要求是实现字典树(前缀树)。
class TrieNode {
public:
// Initialize your data structure here.
TrieNode()
{
memset(branch, 0, sizeof(branch));
isWord = false;
}
TrieNode* branch[26];//记录26个小写字母的分支
bool isWord;//判断某个分支节点是不是单词(比如插入abcd,只有abcd是单词,而abc只是前缀,不是单词;用于辅助search方法)
};
class Trie {
public:
Trie()
{
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string s)
{
if (s.length() == 0 || root == NULL)
return;
TrieNode* p = root;
for (int i = 0; i < s.length(); i++)
{
if (p->branch[s[i] - 'a'] == NULL)
{
p->branch[s[i] - 'a'] = new TrieNode();
}
p = p->branch[s[i] - 'a'];
}
//插入“是单词”的标记
p->isWord = true;
}
// Returns if the word is in the trie.
bool search(string key)
{
if (key.length() == 0 || root == NULL)
return false;
TrieNode* p = root;
int i = 0;
for (; i < key.length() && p!=NULL; i++)
{
p = p->branch[key[i] - 'a'];
}
//遍历到该节点,且该节点做个“是单词”的标记
if (p != NULL && p->isWord == true)
return true;
return false;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix)
{
if (prefix.length() == 0 || root == NULL)
return false;
TrieNode* p = root;
int i;
for (i = 0; i < prefix.length() && p != NULL; i++)
{
p = p->branch[prefix[i] - 'a'];
}
if (p != NULL)
return true;
return false;
}
private:
TrieNode* root;
};