Trie树
这周将Trie树看了一下下面进行总结
概念:Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
在这个Trie结构中,保存了A、to、tea、ted、ten、i、in、inn这8个字符串(有数字的代表单词)
个人理解:Trie树就是将每个单词用树形进行存储,当有几个单词有一样的前缀的时候,可有几天支是相同的
zoj 2876 水题Trie树
#include<iostream> #include<string.h> #include<stdlib.h> #include<stdio.h> using namespace std; #define MAX 26//这是代表26个字母,如果包含数字需要重新定义 struct Trie { Trie *next[MAX]; int v;//v可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。 }; Trie *root; void creatTrie(char *str)//创建结点,并且插入单词 { int len=strlen(str); Trie *p=root,*q; for (int i=0;i<len;i++) { int id=str[i]-'0'; if(p->next[id]==NULL)//如果该字母的下一个点为空,则可以插入新 { q=(Trie *)malloc(sizeof(Trie)); q->v=1; for (int j=0;j<MAX;j++) q->next[j]=NULL; p->next[id]=q; p=p->next[id]; } else//若该结点的下一个字母已经在下一个结点中了 { p->next[id]->v++;//跳过下一个到下下个 p=p->next[id]; } } p->v=-1;//该单词插入完毕,封结点 } int findTrie(char *str) { int len=strlen(str); Trie *p=root; for (int i=0;i<len;i++) { int id=str[i]-'0'; p=p->next[id]; if(p==NULL) return 0;//若为空集,表示不存以此为前缀的串 if(p->v==-1) return -1;////字符集中已有串是此串的前缀 } return -1;////此串是字符集中某串的前缀 } //比如911为窜已存储,输入9133判断911是不是他的前窜 //当911到达第二个1的时候,p->next[id](2)=NULL int dealTrie(Trie *T)//删除树 { int i; if(T==NULL) return 0; for (i=0;i<MAX;i++) { if(T->next[i]!=NULL) dealTrie(T->next[i]); } free(T); return 0; } int main() { int T; char str[100]; scanf("%d",&T); while(T--) { int n,i; int flag=0; root=(Trie *)malloc(sizeof(Trie));//刚开始需要建立结点 for (i=0;i<MAX;i++) root->next[i]=NULL; scanf("%d",&n); scanf("%s",str); creatTrie(str); for (i=1;i<n;i++) { scanf("%s",str); if(flag) continue; if(findTrie(str)==-1) flag=1; else creatTrie(str); } if(flag) printf("NO\n"); else printf("YES\n"); dealTrie(root); } }
模版网站:http://zh.wikipedia.org/wiki/Trie