1.概念:
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅 限于字符串),所以经常被搜索引擎系统用于文本词频统计。
2.优点:
利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
3.性质:
(1):根节点不包含字符,除根节点外每一个节点都只包含一个字符。
(2): 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
(3);每个节点的所有子节点包含的字符都不相同。。。
4.基本操作:
创建结构:
struct node
{
int js;//记录一个字符串是否结束,若是结束,则为1,没有结束,为0
char ch;//记录下当下的字符
struct node *next[26];//每一个父节点都连接了26个子节点
//只不过,他们有的没有用到,就没有开辟空间
}*head,*p;
建树:
void jianshu()
{
char sz[30];//利用数组存储字符串
int i,j,k,l,n;
struct node *now;
head = (struct node *) malloc(sizeof(struct node));
memset(head,0,sizeof(*head));
scanf("%d",&n);//确定输入的字符串的数量
while(n--)
{
scanf("%s",sz);//输入字符串
l = strlen(sz);//计算长度
p = head;//指针指向头
for(i = 0;i < l;i++)
{
j = sz[i] - 'a';//查找该字符应该所在的位置
if(p->next[j] == NULL)//若之前在该位置没有相应的字符
{
now = (struct node *) malloc(sizeof(struct node));//创建新的节点
memset(now,0,sizeof(*now));//初始化
now->ch = sz[i];
p->next[j] = now;//将该节点接入字典树中
}
p = p->next[j];//指针后移
}
now->js = 1;//对一个字符串的结束做标记
}
}
查找:
int chazhao()
{
char sz[30];
int i,j,k;
scanf("%s",sz);//输入要查找的字符串
k = strlen(sz);
p = head;
for(i = 0;i < k;i++)
{
j = sz[i] - 'a';
if(p->next[j] == NULL)//如果没有该字符,则肯定没有该字符串,无需继续查找
return 0;
else
{
p = p->next[j];//移动指针
if(i == k-1)
{
if(p->js == 1)//如果当下是最后一个字符且标记为结束
return 1;//则有该字符串
else
return 0;
}
}
}
}