- /*
- 内容出处: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;
- }
字典树
最新推荐文章于 2023-06-05 04:50:58 发布