zoukankan      html  css  js  c++  java
  • 字典树 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
    ");
    53      else printf("No
    ");
    54     return 0;    
    55 }
    View Code
  • 相关阅读:
    SpringMVC框架(2)
    SpringMVC框架(1)
    (数据结构与算法)跳表实现
    第2次作业
    第1次作业
    第一次作业
    第一周作业.
    第一周作业
    第0次作业
    第一次作业
  • 原文地址:https://www.cnblogs.com/zhenghaotian/p/6641327.html
Copyright © 2011-2022 走看看