它有三个基本性质,根节点不包含字符,除根节点外每一个节点都只包含一个字符,从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串,每个节点的所有子节点包含的字符都不相同。
字典树的基本功能是用来查询某个单词(前缀)在所有单词中出现次数的一种数据结构,它的插入和查询复杂度都为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