试想一下,你查一个单词比如说book,那么你在字典中,先翻到b开头的部分,在翻到b这一段o开始的部分,依次类推,直到找到book这个单词,如果你不小心看错了一个字母,比如book你看成了boak,那么显然你查找到字母a后,查找不下去了,或者是查找到错误的单词,字典树,就是描述的上述过程。
举个栗子:
六个单词:an,am,and,math,mac,ok那么字典树如下:
每个单词结束时给个标记,比如下面画一个短横线。
树结构来实现
#include
inttrie[10005][26];//数组定义字典树,存储下一个字符的位置intnum[10005]={0};//统计某一个字符串为前缀的数量intpos=1;//当前新分配的存储位置voidInsert(charstr[]){intp=0;for(inti=0;str[i];i++){intn=str[i]-'a';if(trie[p][n]==0){//当前节点没有值trie[p][n]=pos++;//为了在num数组中更好的记录前缀出现的次序}p=trie[p][n];num[p]++;}}intFind(charstr[]){intp=0;for(inti=0;str[i];i++){intn=str[i]-'a';if(trie[p][n]==0){return0;}p=trie[p][n];}returnnum[p];}五,应用查找一组单词中,以某个词为前缀的单词有多少个
intmain(){charstr[11];while(gets(str)){if(!strlen(str))break;//输入空行则跳出去Insert(str);}while(gets(str))cout< amandokmathmac//输入结束 ma2a2and1c0 注:当然解决该问题,map为一个不错的方法,只需定义map