字典树 Trie树

什么是Trie树?

形如

其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串。

比如,这个trie树上有ab,abc,bd,dda这些字符串。

至于怎么构建和查找或添加。

简单的一批,看代码就能看懂。

不过Trie树所占的空间很大,有一些优化,暂时还没学。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdio>
 4 
 5 using namespace std;
 6 
 7 #define idx(x) x - 'a'
 8 const int maxn = 10000;
 9 struct trie
10 {
11     int next[26];//next数组中存放的下标表示他的子树在tree[]中的位置 
12     int val;//表示是否存在当前字符串 
13 }tree[maxn];
14 
15 int nex, T;//nex表示tree中下标 
16 char str[maxn];
17 
18 void Insert(char *s)//插入 
19 {
20     int i, rt = 0, len = strlen(s) - 1;
21     for(i = 0; i <= len; i++)
22     {
23         int c = idx(s[i]);
24         if(!tree[rt].next[c]) tree[rt].next[c] = ++nex; 
25         rt = tree[rt].next[c];//迭代 
26     }
27     tree[rt].val = 1;
28 }
29 
30 bool Find(char *s)//查找 
31 {
32     int i, rt = 0, len = strlen(s) - 1;
33     for(i = 0; i <= len; i++)
34     {
35         int c = idx(s[i]);
36         if(!tree[rt].next[c]) return 0;
37         rt = tree[rt].next[c];//迭代 
38     }
39     if(tree[rt].val) return 1;
40     return 0;
41 }
42 
43 int main()
44 {
45     scanf("%d", &T);
46     while(T--)
47     {
48         scanf("%s", str);
49         Insert(str);
50     }
51     while(scanf("%s", str))
52      if(Find(str)) printf("Yes\n");
53      else printf("No\n");
54     return 0;    
55 }
View Code

 

posted @ 2017-03-29 19:17  zht467  阅读(145)  评论(0编辑  收藏  举报