Trie树

Trie总结

概念:Trie,又称单词查找树键树,是一种形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

在这个Trie结构中,保存了A、to、tea、ted、ten、i、in、inn这8个字符串(有数字的代表单词)

个人理解:Trie树就是将每个单词用树形进行存储,当有几个单词有一样的前缀的时候,可有几天支是相同的

View Code
 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 }
原文地址:https://www.cnblogs.com/zsboy/p/2879587.html