字典树Trie树

Posted planche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典树Trie树相关的知识,希望对你有一定的参考价值。

摘自大佬博客

https://www.cnblogs.com/TheRoadToTheGold/p/6290732.html

 

给出n个单词和m个询问
1.查询某个前缀是否出现过
2.查询某个单词是否出现过
3.查询前缀出现的次数

 

例如:
cat,cash,app,apple,aply,ok 建一颗字典树

技术分享图片

 


这里有两种编号:
1.相对整棵树而言(根据单词insert顺序 dfs序)

2.相对于每个节点而言 

也就是说每个节点其实都开了26条分支
k=trie(i,j): 表示i号节点第j号分支的值为k
sum[i]:记录i节点被多少个单词经过(且记录的是后一个节点的位置!)

建树,插入函数
int tot=0;//记录1类编号

void insert(char *s){
len=strlen(s);
root=0;
For(i,0,len-1){
int id=s[i]-‘a‘;
if(!trie[root][id])trie[root][id]=++tot;
sum[trie[root][id]]++; //注意是在后一个点位置+1
root=trie[root][id];
}
vis[root]=1;
}


查询前缀或者单词是否出现
//查单词要多用个vis[]标记下结束点

bool find(char *s){
int rt=0;
For(i,0,strlen(s)-1){
int id=s[i]-‘a‘;
if(!trie[rt][id])return false;
rt=trie[rt][id];
}
//if(vis[rt])return true;//查单词
return true;//查前缀
}


查询前缀出现次数

int search(char *s){
int rt=0;
For(i,0,strlen(s)-1){
int id=s[i]-‘a‘;
if(!trie[rt][id])return 0;
rt=trie[rt][id];
}
return sum[rt];
}

以上是关于字典树Trie树的主要内容,如果未能解决你的问题,请参考以下文章

字典树(前缀树)--Trie

Trie树(字典树)

C++ 树进阶系列之深度剖析字典(trie)树

剑指Offer——Trie树(字典树)

208. 实现 Trie (前缀树)-字典树

trie树(字典树)