#define MAXN 30
//字典树节点结构体
typedef struct Trie{
bool end; //是否结束
struct Trie* next[MAXN]; //子节点指针数组
}Trie;
//返回一个初始化好的节点
Trie* trieCreate(){
Trie* tree=(Trie* )malloc(sizeof(Trie));
tree->end=false;
for(int i=0;i<MAXN;i++)
tree->next[i]=NULL;
return tree;
}
//在树中插入一个单词
void trieInsert(Trie* obj, char* word){
int i=0,k;
Trie* t=obj;
while(word[i]){
//找到该字符在子节点数组中的位置
k=word[i]-'a';
//若在子节点不存在该字符,则新建节点置过去
if(!t->next[k]){
Trie* temp=trieCreate();
t->next[k]=temp;
}
//去下一层继续和下一位比较
t=t->next[k];
i++;
}
t->end=true;
}
//在树中查找单词
bool trieSearch(Trie* obj, char* word){
int i=0,k;
Trie* t=obj;
while(word[i]){
k=word[i]-'a';
//任意字符不在子节点数组则返回false;
if(!t->next[k])
return false;
t=t->next[k];
i++;
}
//树中有apple,查app返回false;
if(t->end)
return true;
return false;
}
//查找是否有以prefix为前缀的单词;
bool trieStartsWith(Trie* obj, char* prefix){
int i=0,k;
Trie* t=obj;
while(prefix[i]){
k=prefix[i]-'a';
if(!t->next[k])
return false;
t=t->next[k];
i++;
}
//树中有apple,查app返回true;
return true;
}
//释放空间
void trieFree(Trie* obj){
if(!obj)
return;
for(int i=0;i<MAXN;i++){
if(obj->next[i])
trieFree(obj->next[i]);
}
free(obj);
}
字典树
最新推荐文章于 2019-07-25 15:07:22 发布