随着数据的不断插入,根据需要不断创建 TrieNodeTrieNode 节点。
对于每一个结点都存放下一个字符所在的地址 因此我们就可以实现对于一个字符串是否在这个树内的快速查询。
Trie() 初始化前缀树对象。
void insert(String word) 向前缀树中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
class Trie {
private:
bool isEnd;
Trie* son[26];
public:
Trie()
{ //构造函数
isEnd=false;
memset(son,0,sizeof(son));
}
~Trie() //析构函数
{
for(int i=0;i<26;++i)
{
if(son[i]!=nullptr)
{
delete son[i];
}
}
}
void insert(string word) {
Trie* node=this; //代表根节点
for(auto each:word)
{
if(node->son[each-'a']==NULL)
{
node->son[each-'a']=new Trie();
}
node=node->son[each-'a']; //到子节点进行插入
}
node->isEnd=true;
}
bool search(string word) {
Trie* node=this;
for(auto each:word)
{
node=node->son[each-'a'];
if(node==NULL)
{
return false;
}
}
//遍历完后判断是否是isend
return node->isEnd;
}
bool startsWith(string prefix) {
Trie* node=this;
for(auto each:prefix)
{
node=node->son[each-'a'];
if(node==NULL)
{
return false;
}
}
//遍历完后直接返回true 因为一定是前缀
return true;
}
};
/**
* Your Trie object will be instantiated and called as such:
* Trie* obj = new Trie();
* obj->insert(word);
* bool param_2 = obj->search(word);
* bool param_3 = obj->startsWith(prefix);
*/