它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
它有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\n",word[value]);
else
printf("eh\n"); //没找到输出eh
}
return 0;
}