这是我第一次接触字典树,感觉还不是很不熟悉。这是仿照别人的代码写出来的。
但是我还不是理解,为什么要用
#include <stdio.h>
#define MAX 26
typedef struct TriNode
{
int count;
struct TriNode *next[MAX];
}TriNode;
int t=0;
TriNode a[1000000];
void InitTriNode(TriNode ** proot)
{
*proot=NULL;
}
TriNode * CreatTriNode()
{
int i;
TriNode *p=&a[t++];
p->count=1;
for(i=0;i<MAX;i++)
{
p->next[i]=NULL;
}
return p;
}
void InsertTriNode(TriNode ** proot,char *s)
{
TriNode *p;
int i=0,k;
if(!(p=*proot))
{
p=*proot=CreatTriNode();
}
while(s[i])
{
k=s[i++]-'a';
if(p->next[k])
{
p->next[k]->count++;
}
else
{
p->next[k]=CreatTriNode();
}
p=p->next[k];
}
}
int Search (TriNode **proot,char *s)
{
TriNode *p;
int i=0,k;
if(!(p=*proot))
{
return 0;
}
while(s[i])
{
k=s[i++]-'a';
if(p->next[k]==NULL)
{
return 0;
}
else
{
p=p->next[k];
}
}
return p->count;
}
int main()
{
char s[11];
TriNode *proot=NULL;
InitTriNode(&proot);
while(gets(s)&&s[0])
{
InsertTriNode(&proot,s);
}
while(gets(s))
{
printf("%d\n",Search(&proot,s));
}
return 0;
}
自己对字典树的理解:
字典树就是构造一颗由字母构成的树。数的根节点没有储存任何东西,为空,特别要突出根节点(*Proot)。每个节点储存的是该节点的子节点*next[MAX]和该节点出现的次数。构造一颗完整的字典树要用到,初始化函数,插入函数,删除函数,搜索函数等。
第二次自己写的代码:
#include <iostream> #include <stdio.h> using namespace std; #define MAX 26 typedef struct Trie { int count; Trie *next[MAX]; }Trie; Trie *root; Trie * CreatTrie() { Trie *p; p->count=1; for(int i=0;i<MAX;i++) { p->next[i]=NULL; } return p; } void Insert(char *s) { Trie *p=root; int i=0,k; while(s[i]) { k=s[i++]-'a'; if(p->next[k]==NULL) { p->next[k]=new Trie(); p->next[k]->count=1; } else { p->next[k]->count++; } p=p->next[k]; } } int Search(char *s) { Trie *p=root; int i=0,k; while(s[i]) { k=s[i++]-'a'; if((p->next[k])==NULL) { return 0; } p=p->next[k]; } return p->count; } int main() { char s[100]; root=new Trie(); while(gets(s)&&s[0]) { Insert(s); } while(gets(s)) { printf("%d\n",Search(s)); } return 0; }
其实这个只要理解了就很简单了。。。