Trie总结
概念:Trie,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。
在这个Trie结构中,保存了A、to、tea、ted、ten、i、in、inn这8个字符串(有数字的代表单词)
个人理解:Trie树就是将每个单词用树形进行存储,当有几个单词有一样的前缀的时候,可有几天支是相同的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<stdio.h> 5 using namespace std; 6 #define MAX 26//这是代表26个字母,如果包含数字需要重新定义 7 8 struct Trie 9 { 10 Trie *next[MAX]; 11 int v;//v可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。 12 }; 13 Trie *root; 14 15 void creatTrie(char *str)//创建结点,并且插入单词 16 { 17 int len=strlen(str); 18 Trie *p=root,*q; 19 for (int i=0; i<len; i++) 20 { 21 int id=str[i]-'0'; 22 if(p->next[id]==NULL)//如果该字母的下一个点为空,则可以插入新 23 { 24 q=(Trie *)malloc(sizeof(Trie)); 25 q->v=1; 26 for (int j=0; j<MAX; j++) q->next[j]=NULL; 27 p->next[id]=q; 28 p=p->next[id]; 29 } 30 else //若该结点的下一个字母已经在下一个结点中了 31 { 32 p->next[id]->v++;//跳过下一个到下下个 33 p=p->next[id]; 34 } 35 } 36 p->v=-1;//该单词插入完毕,封结点 37 } 38 int findTrie(char *str) 39 { 40 int len=strlen(str); 41 Trie *p=root; 42 for (int i=0; i<len; i++) 43 { 44 int id=str[i]-'0'; 45 p=p->next[id]; 46 if(p==NULL) return 0;//若为空集,表示不存以此为前缀的串 47 if(p->v==-1) return -1;////字符集中已有串是此串的前缀 48 } 49 return -1;////此串是字符集中某串的前缀 50 } //比如911为窜已存储,输入9133判断911是不是他的前窜 //当911到达第二个1的时候,p->next[id](2)=NULL 51 52 int dealTrie(Trie *T)//删除树 53 { 54 int i; 55 if(T==NULL) return 0; 56 for (i=0; i<MAX; i++) 57 { 58 if(T->next[i]!=NULL) dealTrie(T->next[i]); 59 } 60 free(T); 61 return 0; 62 } 63 int main() 64 { 65 int T; 66 char str[100]; 67 scanf("%d",&T); 68 while(T--) 69 { 70 int n,i; 71 int flag=0; 72 root=(Trie *)malloc(sizeof(Trie));//刚开始需要建立结点 73 for (i=0; i<MAX; i++) root->next[i]=NULL; 74 scanf("%d",&n); 75 scanf("%s",str); 76 creatTrie(str); 77 for (i=1; i<n; i++) 78 { 79 scanf("%s",str); 80 if(flag) continue; 81 if(findTrie(str)==-1) flag=1; 82 else creatTrie(str); 83 } 84 if(flag) printf("NO\n"); 85 else printf("YES\n"); 86 dealTrie(root); 87 } 88 }