大家好,我是刘天昊,这次带来的数据结构-前缀树
那么先看题目,同样c语言带来的trie树
very funny
Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
题目告诉我们只用26个小写字母那么直接po代码注释,trie树网上资料很多,可以直接撸代码理解我简单注释下
typedef struct TrieNode
{
bool isStr;//判断是否是一个字符串;
struct TrieNode *next[26];//因为只用了26个小写字母;
}Trie;
/** Initialize your data structure here. */
Trie* trieCreate() //初始化一个树的根结点
{
Trie *root=(Trie *)malloc(sizeof(Trie));//根结点申请空间
for(int i=0;i<26;i++)
{
root->next[i]=NULL;
}
root->isStr=false;//跟结点不存放字符信息
return root;
}
/** Inserts a word into the trie. */
void trieInsert(Trie* obj, char* word) //插入词到咋们的字典树里
{
if(obj==NULL||*word=='\0')//注意这些边界条件往往是最不可以忽视的
{
return NULL;
}
Trie *p=obj;
for(int i=0;*(word+i)!='\0';i++)
{
if(p->next[word[i]-'a']==NULL)//没有的话我们申请个内存放进去
{
Trie *temp=(Trie *)malloc(sizeof(Trie));
for(int j=0;j<26;j++)
{
temp->next[j]=NULL;
}
temp->isStr=false;
p->next[word[i]-'a']=temp;
p=p->next[word[i]-'a'];//移动到对应字母的结点
}
else
{
p=p->next[word[i]-'a'];
}
}
p->isStr=true;//在一个词的最后判断这是一个字符我描述的可能不太好但是就这个意思
}
/** Returns if the word is in the trie. */
bool trieSearch(Trie* obj, char* word) //判断这个词是不是在字典树里
{
Trie *p=obj;
for(int i=0;word[i]!='\0';i++)
{
p=p->next[word[i]-'a'];
if(p==NULL)//字符还没有结束的时候访问了空结点说明不存在这个字符串
{
return false;
}
}
if(p->isStr==true)
{
return true;
}
return false;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool trieStartsWith(Trie* obj, char* prefix) //判断是否有这么个前缀
{
Trie *p=obj;
if(*prefix=='\0')
{
return true;
}
for(int i=0;*(prefix+i)!='\0';i++)
{
p=p->next[prefix[i]-'a'];
if(p==NULL)
{
return false;
}
}
return true;
}
void trieFree(Trie* obj) 递归的去释放一个树
{
if(obj==NULL)
{
return ;
}
for(int i=0;i<26;i++)
{
if(obj->next[i]!=NULL)
{
trieFree(obj->next[i]);
}
}
free(obj);
}
/**
* Your Trie struct will be instantiated and called as such:
* struct Trie* obj = trieCreate();
* trieInsert(obj, word);
* bool param_2 = trieSearch(obj, word);
* bool param_3 = trieStartsWith(obj, prefix);
* trieFree(obj);
*/
这个trie树可以解决很多问题,以后再说
这次到这里