字典树,Trie树,是一种树形结构,是一种哈希树的变种,典型功能是用于统计,排序和保存大量的字符串。优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串的比较。
代码模板:
#define maxn 26 //由题目的字符总数决定
typedef struct TrieNode
{
bool isStr;
struct TrieNode *next[maxn];
} Trie;
void insertTrie(Trie *root , const char *str)
{
if(root == NULL || *str =='\0')
return ;
Trie *p = root ;
while(*str != '\0')
{
int id = *str - 'a';
if(p->next[id] == NULL)
{
Trie *temp = (Trie *)malloc(sizeof(Trie));
for(int i=0;i<maxn;i++)
{
temp->next[i] = NULL;
}
temp->isStr = false;
p->next[id] = temp;
p = p->next[id];
}
else
{
p = p->next[id];
}
str++;
}
p->isStr = true;
}
int searchTrie(Trie *root , const char *str)
{
Trie *p = root;
int len = strlen(str);
for(int i=0;i<len;i++)
{
if(p->isStr == false && p->next[*str-'a'] == NULL)
return 0;
if(p->next[*str-'a']->isStr == true)
return 1; //已经存在str的子串
p=p->next[*str-'a'];
str++;
}
return 2;
}
void dealTrie(Trie *root)
{
//先对一个结点递归的查找maxn个子树,遍历完成后,释放根树内存
for(int i=0;i<maxn;i++)
{
if(root->next[i] != NULL)
{
dealTrie(root->next[i]);
}
}
free(root);
}