Babelfish trie树的基础

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
const int maxn=100005,KIND=26;
int m;//m为建trie树所输入的单词次序
char s[30];
char s1[maxn][15];
char s2[15];
char str[15];
struct node
{
    char *s;
    int prefix;//表示插入单词的先后次序,即这个单词是第几次插入的.
    bool isword;
    node *next[KIND];//可能的最大节点数,该数组用来存26个字母
    node()
    {
        s=NULL;
        prefix=-1;
        isword=false;
        memset(next,0,sizeof(next));
    }
}*root;//根
void insert(node *root,char *s)
{
    node *p=root;
    for(int i=0;s[i];i++)
    {
        int x=s[i]-'a';
        p->s=s+i;
        if(p->next[x]==NULL)
        p->next[x]=new node;
        p=p->next[x];
    }
    p->prefix=m++;
    p->isword=true;
}
int search(char *s,node *root)
{
    node *p=root;
    for(int i=0;s[i];i++)
    {
        int x=s[i]-'a';
        p->s=s+i;
        if(p->next[x]==NULL)//按单词的节点逐个查询,如果都存在且查询到根节点,跳出循环,返回true,即p->isword
        return -1;
        p=p->next[x];
    }
    //return p->isword;
    if(p->isword)//如果搜索的单词存在,则返回前缀.
      return p->prefix;
    return -1;
}
int main()
{
    m=0;
    root=new node;
    while(1)
    {
        gets(s);
        if(strcmp(s,"")==0) break;
        sscanf(s,"%s%s",s1[m],s2);
        s1[m][strlen(s1[m])]='\0';
        s2[strlen(s2)]='\0';
        insert(root,s2);
    }
    while(gets(str))
    {
        int num=search(str,root);
        if(num==-1) printf("eh\n");
        else puts(s1[num]);
    }
    return 0;
}
 

    原文作者:Trie树
    原文地址: https://blog.csdn.net/ehi11/article/details/7820306
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞