Trie字典树
目录
一、概述
1.基本概念
字典树,又称为单词查找树,Tire数,是一种树形结构,它是一种哈希树的变种。
2.基本性质
- 根节点不包含字符,除根节点外的每一个子节点都包含一个字符
- 从根节点到某一节点。路径上经过的字符连接起来,就是该节点对应的字符串
- 每个节点的所有子节点包含的字符都不相同
二、基本操作
1.初始化
一棵空Trie仅包含一个根结点,该点的字符指针均指向空。
2.插入
当需要插入一个字符串S时,我们令一个指针P起初指向根结点。然后,依次扫描S中的每个字符c:
(1)若指针P的c字符指针指向一个已经存在的结点Q,则令P=Q。
(2)若指针P的c字符指针指向空,则新建一个节点Q,令P的c字符指针指向Q,然后令P=Q。
(3)当S中的字符扫描完毕时,在当前结点指针P上标记它是一个字符串的末尾。
3.查询
当需要查询一个字符串S在Trie中是否存在时,我们令一个指针P起初指向根节点,然后依次扫描S中的每个字符c:
(1)若指针P的c字符指针指向空,则说明S没有被插入过Trie,结束查询。
(2)若指针P的c字符指针指向一个已经存在的结点Q,则令P=Q。
(3)当指针S中的字符扫描完毕时,若当前结点P被标记为一个字符串的末尾,则说明S在Trie中已经存在,否则说明S没有被插入过Trie。
三、代码实现
int ch[N][Z]; //Z为字符集大小
bool vis[N];//若vis=true则表示从根到该点经过的边上的字母成的字符串是实际字符串集合中的元素
//对一个字符集为小写英文字母的Trie插入一个字符串S
char s[105];
void insert()
{
int len=strlen(s);
int u=1,tot=1;//1为根节点
for(int i=0;i<len;i++)
{
int c=s[i]-'a';
if(!ch[u][c])//若不存在这条边则要新建一个节点与转移边
ch[u][c]=++tot;//tot为总点数
u=ch[u][c];
}
vis[u]=true;//在串的结尾处将vis赋值,表示它代表一个实际字符串集合中的元素
}
//查询一个字符串S是否是给定字符串集合中某个串的前缀
bool findpre()
{
int len=strlen(s);
int u=1;
for(int i=0;i<len;i++)
{
int c=s[i]=='a';
if(!ch[u][c])return false;
u=ch[u][c];
}
return true;
}