字典树(Trie树、字母数、前缀树)
作用
一般是存储单词(以下操作仅限于小写单词树)
优点
共用前缀,省空间,查询快
Trie树的应用
(1) 字符串检索
(2) 字符串最长公共前缀
支持操作
询问单词
插入单词
删除单词
操作工具
一棵树,用ch[u][i]表示u节点的i号儿子(i唯一的确定了一个从a到z的字母)的编号,相当于指针
一个单词,用于插入或询问是否在树
bool类型的if_end[u],表示u节点存储的是否为一整个单词
边和节点
边存的是字母,节点存的是从根到此节点经过路径所连成的单词
根节点啥也没有
插入
void insert(char *s)
{
int len = strlen(s);
int u = 1;//根
for(int i=0;i<len;i++)
{
int c = s[i]-'a';
if(ch[u][c]==0)
ch[u][c]=++tot;//tot节点总数
u = ch[u][c];
}
bo[u] = 1;
}
查询
bool find(char *s)
{
int u = 1;
int len = strlen(s);
for (int i = 0; i < len; i++)
{
int c = s[i] - 'a';
if(!ch[u][c])
return 0;
u = ch[u][c];
}
return true;
}
####删除
···
##做题时注意分类讨论
###其实Trie不仅可以寸单词,还可应用于异或,称之为01字典树