字典树 模版

来源:互联网 发布:centos共享文件夹在哪 编辑:程序博客网 时间:2024/05/01 00:14
/*内容出处:http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html字典树最主要的操作:    ·每次从跟节点开始一次搜索    ·取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索    ·在相应的子树上取得要查询关键词的第二个字母,并进一步选择对应的子树进行检索    ·迭代过程    ·在某个节点初,关键词的所有字母已被取出,则读取附在该节点上的信息,即完成查找*/#include <iostream>#include<string.h>#include<stdio.h>#include<stdlib.h>#define MAX 26using namespace std;//trie的数据结构定义struct Trie{    Trie *next[MAX];    int v;//根据需要变化};Trie *root;void createTrie(char *str){    int len=strlen(str);    Trie *p=root;    Trie *q;    for(int i=0;i<len;i++)    {        int id=str[i]-'0';//询问p有指向id的值吗?        if(p->next[id]==NULL)        {//如果没有执行第id个的值,那么就建立一个指向第id个的值            q=(Trie *)malloc(sizeof(Trie));            //为这个值初始化            q->v=1;            //设置q这个节点的孩子节点为空            for(int j=0;j<MAX;j++)            {                q->next[j]=NULL;            }            p->next[id]=q;            //p深入一层            p=p->next[id];        }        else        {            p->next[id]->v++;            p=p->next[id];        }    }    p->v=-1;//若为结尾,则将v改成-1表示}//查找int findTrie(char *str){    int len=strlen(str);    Trie *p=root;    for(int i=0;i<len;i++)    {        int id=str[i]-'0';//str为一串数字        p=p->next[id];        if(p==NULL)//若为空集,表示不存在以此为前缀的串            return 0;        if(p->v==-1)//字符集中已串是此串的前缀            return -1;    }    return -1;//此串是字符集中某串的前缀}int dealTrie(Trie *T){    int i;    if(T==NULL)    {        return 0;    }    for(i=0;i<MAX;i++)    {        if(T->next[i]!=NULL)            dealTrie(T->next[i]);    }    free(T);    return 0;}int main(){    char word[10];    gets(word);    createTrie(word);    printf("%d",findTrie(word));    return 0;}


 

原创粉丝点击