/*
内容出处: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 26
using 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;
}