它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 它有3个基本性质: 根节点不包含字符,除根节点外每一个节点都只包含一个字符; 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串; 每个节点的所有子节点包含的字符都不相同。 #include <iostream> #include<cstring> #include<cstdio> using namespace std; const int M=1000000; char word[100000][11]; int wp; struct node { int next[26]; int value; bool end; }tree[M]; int pi=1; void init() //初始化 { memset(tree,0,sizeof(tree)); //将一个数组全部元素赋成0 //只能是-1和0 pi=1; wp=0; } void insert(char * keyword,int value) //建树 { int index,p,i; for(i=p=0;keyword[i];i++) { index=keyword[i]-'a'; // if(tree[p].next[index]==0) // tree[p].next[index]=pi++; p=tree[p].next[index]; } tree[p].value=value; tree[p].end=1; } bool query(char * keyword,int& value) { int index,p,i; for(i=p=0;keyword[i];i++) { index=keyword[i]-'a'; if(tree[p].next[index]==0) return 0; p=tree[p].next[index]; } if(tree[p].end) { value=tree[p].value; return 1; } return 0; } int main() { char s1[15],s2[15],s[30]; int i,value; while(gets(s)) { if(!strlen(s)) //有字母就不跳出 break; for(i=0;i<strlen(s);i++) { if(s[i]==' ') //空格 break; } strncpy(s1,s,i); //把s的前i位复制给s1 s1[i]=0; strcpy(s2,s+i+1); //把s的i位之后复制给s2 strcpy(word[wp],s1); // insert(s2,wp++); // } while(scanf("%s",s)!=EOF) { if(query(s,value)) //到相应字母 然后输出 printf("%s ",word[value]); else printf("eh "); //没找到输出eh } return 0; }