https://leetcode.com/problems/implement-trie-prefix-tree/
class TrieNode {
public:
// Initialize your data structure here.
TrieNode() :c(0), isend(false){
}
std::map<char, TrieNode> _sonNodes;
char c;
bool isend;
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string word) {
if (word.empty())
{
return;
}
TrieNode* tmpNode = &root->_sonNodes[word[0]];
if (tmpNode->c == 0)
{
tmpNode->c = word[0];
}
for (auto i = 1; i < word.size(); ++i)
{
char c = word[i];
if (tmpNode->c == 0)
{
tmpNode->c = c;
}
else
{
auto it = tmpNode->_sonNodes.find(c);
if (it == tmpNode->_sonNodes.end())
{
tmpNode->_sonNodes[c].c = c;
tmpNode = &tmpNode->_sonNodes[c];
}
else
{
tmpNode = &it->second;
}
}
}
tmpNode->isend = true;
}
// Returns if the word is in the trie.
bool search(string word) {
TrieNode* tmpNode = root;
for (auto i = 0; i < word.size(); ++i)
{
auto it = tmpNode->_sonNodes.find(word[i]);
if (it == tmpNode->_sonNodes.end())
{
return false;
}
else
{
tmpNode = &it->second;
}
}
return tmpNode->isend == true;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {
TrieNode* tmpNode = root;
for (auto i = 0; i < prefix.size(); ++i)
{
auto it = tmpNode->_sonNodes.find(prefix[i]);
if (it == tmpNode->_sonNodes.end())
{
return false;
}
else
{
tmpNode = &it->second;
}
}
return true;
}
private:
TrieNode* root;
};