Trie树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
它有3个基本性质:根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;每个节点的所有子节点包含的字符都不相同。
下面给出添加和查找的代码如下:
# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<malloc.h>
# define MAX 26 //我们只算了字母,所以保存每个节点最多有26个子节点
typedef struct trie{
struct trie *pNext[MAX];
int v; //保存这个顶点被访问的次数
}Trie;
void CreateTrie(Trie *root,char *str);
int findTrie(Trie *root,char *str);
int main(void){
int i;
Trie root;
chars1[100] = "abcdef";
chars2[100] = "ab";
//初始的时候让根节点的所有下一个节点都为NULL
for(i=0;i<MAX;i++){
root.pNext[i] = NULL;
}
CreateTrie(&root,s1);
findTrie(&root,s2);
return0;
}
//将字符串加入到字典树中去
void CreateTrie(Trie *root,char *str){
int i,j;
Trie *p = root,*q;
int len = strlen(str);
for(i=0;i<len;i++){
int curStrNum = str[i] - 'a'; //把对应的字母转化为数字下标
if(p->pNext[curStrNum] ==NULL){ //判断该节点的下一个节点中是否已经存在此字母
q = (Trie *)malloc(sizeof(Trie));
q->v = 1; //初始化为1
for(j=0;j<MAX;j++){
q->pNext[j] = NULL; //把该字母的所有下一个节点都为NULL
}
p->pNext[curStrNum] = q; //链表指向
p = p->pNext[curStrNum]; //p回制
}else{
p->pNext[curStrNum]->v++; //如果已经存在了就让节点++
p = p->pNext[curStrNum];
}
}
}
//判断给定的字符串在字典树中是否已有此串的前缀字符
int findTrie(Trie *root,char*str){
int i;
Trie *p = root;
int len = strlen(str);
for(i=0;i<len;i++){
int curStrNum = str[i] - 'a';
if(p->pNext[curStrNum]== NULL){ //说明没有以此字符为前缀的字符
return 0;
break;
}else{
p= p->pNext[curStrNum]; //有的话就跑到下一个节点去继续查找
}
}
return 1; //遍历完成以后如果没有找到不匹配的节点,就返回真
}