字典树,又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
它有3个基本性质:
1.根节点不包含字符,除根节点外每一个节点都只包含一个字符;
2.从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串;
3.每个节点的所有子节点包含的字符都不相同。
#include <iostream>
#include <string.h>
using namespace std;
struct node{
int num; //记录多少单词途径该节点,即多少单词拥有以该节点为末尾的前缀
node *next[26]; //26个子节点,用来代表26个不同字母 0存a ,1存b 。。。
};
node root,*newnode;
void insert(char *a, int len){
node *cur = &root; //当前结点移动到根节点
for (int n = 0; n < len; n++){//遍历串中所有字符
if (cur->next[a[n]-'a'] == NULL){//检查结点中是否含有a[n]-'a'所代表的字母
newnode = new node;
for (int i = 0; i < 26; i++)
newnode->next[i] = NULL;
newnode->num = 1;
cur->next[a[n] - 'a'] = newnode; //新建一个结点并置于当前的后一个结点
cur = newnode; //当前结点移动的新建结点;
}
else{ //如果某一结点的下一结点不为空
cur = cur->next[a[n] - 'a'];
cur->num++;
}
}
}
int find(char *a, int len){
node *cur = &root; //从根节点开始
for (int n = 0; n < len; n++){
if (cur->next[a[n] - 'a'] != NULL)
cur = cur->next[a[n] - 'a'];
else
return 0;
}
return cur->num;
}
int main(){
char c[1000];
while (cin.getline(c, 1000) && strlen(c) != 0){
insert(c, strlen(c));
}
while (cin.getline(c, 1000)){
cout << find(c, strlen(c)) << endl;
}
}