Trie树初探

最近在搞搞Trie,写篇博客总结一下吧.

Trie就是将字符串的每个字符用树的边储存,查询时只要沿着根节点往下爬。

Trie的根节点为空,表示空串.

----------------------------------------------------------------------------------------------------

在详细的操作前,我们先了解一下几个数组。

trie[u][c]=x表示编号为u的节点的第c个孩子编号为x.

这里的编号有两个含义,u,x表示字符插入trie时的顺序编号,c表示这个字符在其字符集中的编号(如a表示1,b表示2....)

f[u]表示这个插入的单词是否以u结尾。

如图

u,x为红色标号,c为蓝色编号

Trie具体上有两个操作:

插入

 1 void insert(char *s) {
 2 
 3   int u=1; int len=strlen(s); //u=1表示根节点
 4 
 5   for (int i=0;i<len;i++){
 6 
 7     int c=s[i]-'a';//计算c编号
 8 
 9     if (!trie[u][c]) trie[u][c]=++tot;//如果字符未出现则插入
10 
11     u=trie[u][c];//根节点指向下一位
12 
13   }
14 
15   f[u]=true;//给单词末尾打上标记
16 
17 }

查询

 1 bool find(char *s)
 2 {
 3 int u=1; 
 4 int len=strlen(s);
 5   for (int i=0;i<len;i++){
 6     int c=s[i]-'a';
 7     if (!trie[u][c]) {
 8     return false;//查询单词是否出现
 9     break;
10     }
11   u=trie[u][c];
12   }
13   return true;
14 }

查询操作中我们也可以添加数组查询前缀个数等等,但大体思路都是沿着根往下查询统计.

----------------------------------------------------------------------------------------------------

题目练习:

 1.

猜你喜欢

转载自www.cnblogs.com/Kaleidoscope233/p/9280318.html
今日推荐