它有三个基本性质,根节点不包含字符,除根节点外每一个节点都只包含一个字符,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。

字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,它的插入和查询复杂度都为O(len),Len为单词(前缀)长度,但是它的空间复杂度却非常高,如果字符集是26个字母,那每个节点的度就有26个,典型的以空间换时间结构。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<stack>
using namespace std;
struct trie
{
struct trie *child[26];
int n;
};
struct trie *root;
void insert(char *source)
{
int i,j;
int len;
struct trie *current,*newnode;
len=strlen(source);
current=root;
for(i=0;i<len;i++){
if(current->child[source[i]-‘a‘]!=0){
current=current->child[source[i]-‘a‘];
current->n++;
}
else{
newnode=(struct trie *)malloc(sizeof(struct trie));
for(j=0;j<26;j++) newnode->child[j]=0;
current->child[source[i]-‘a‘]=newnode;
current=newnode;
current->n=1;
}
}
}
int search(char *source)
{
int i;
int len;
struct trie *current;
len=strlen(source);
if(len==0) return 0;
current=root;
for(i=0;i<len;i++){
if(current->child[source[i]-‘a‘]!=0){
current=current->child[source[i]-‘a‘];
}
else return 0;
}
return current->n;
}
/*
int Delete(char *source)
{
stack<struct trie *> q;
int i;
int len;
struct trie *current;
len=strlen(source);
if(len==0) return 0;
current=root;
for(i=0;i<len;i++){
if(current->child[source[i]-‘a‘]!=0){
q.push(current->child[source[i]-‘a‘]);
}
else return 0;
}
while(!q.empty()){
}
}
*/
int main()
{
char str[20];
int i;
root=(struct trie *)malloc(sizeof(struct trie));
for(i=0;i<26;i++) root->child[i]=0;
root->n=0;
while(gets(str),strcmp(str,"")!=0){
insert(str);
}
while(gets(str)){
printf("%d\n",search(str));
}
}
原文:http://blog.csdn.net/cnh294141800/article/details/22316653