字典树trie

字典树trie

又称单词查找树,trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。(这段来自百度百科。。)

字典树trie

字典树

char word1[maxn][51],word2[maxn][51];

int cnt=0;

char ans[51];



struct Node

{

    char s[51];

    bool end;      //结束标志,1表示有单词,0表示没有

    Node *next[26];

};Node T={{0},0,{NULL}}; //头结点不存数据,牺牲一个结点的空间只是为了方便。。



void insert(char*s1,char*s2)

{

    Node *p=&T;

    for(int i=0;i<strlen(s2);i++){

        if(p->next[s2[i]-'a']==NULL){

            Node *newnode=(Node*)malloc(sizeof(Node));

            memset(newnode,0,sizeof(Node));

            p->next[s2[i]-'a']=newnode;

        }

        p=p->next[s2[i]-'a'];

    }

    p->end=1;

    strcpy(p->s,s1);

}



bool find(char *s)

{

    Node *p=&T;

    for(int i=0;i<strlen(s);i++){

        if(p->next[s[i]-'a']==NULL) return false;

        p=p->next[s[i]-'a'];

    }

    if(p->end==0) return false;

    strcpy(ans,p->s);

    return true;

}



int main()

{

    char tmp[110];

    while(gets(tmp)&&strlen(tmp)){

        sscanf(tmp,"%s%s",word1[cnt],word2[cnt]);

        insert(word1[cnt],word2[cnt]);

        cnt++;

    }

    while(gets(tmp)!=NULL&&strlen(tmp)){

        if(find(tmp)) printf("%s\n",ans);

        else printf("eh\n");

    }

    return 0;

}
trie树

 

你可能感兴趣的:(trie)