字典树个人觉得是一种比较简单的数据结构,没什么技巧性,无非就是hash的一种变形!优点:在树的深度较低的情况下查询效率比较高;缺点:对空间要求比较高!为了便于理解贴图如下:
/*下图分别存储字符串 abc,cd,defg,根节点不存储任何字符!*/
个人总结一段模板如下:
结构体:
struct node
{
int f;
node *next[M];
node()
{
f=0;
for(int i=0 ; i<M ; i++ )
next[i]=NULL ;
}
}*Root;
核心代码:
void insert(char s[])
{
int i;
node *r=Root;
int len=strlen(s);
for(i=0;i<len;i++)
{
if(!(r->next[s[i]-'a']))
r->next[s[i]-'a']=new node();
r=r->next[s[i]-'a'];
}
r->f=1;
}
int search(char s[],int len)
{
int i;
node *r=Root;
for(i=0 ; i<len ; i++)
{
if(!(r->next[s[i]-'a'])) return 0;
r=r->next[s[i]-'a'];
}
if(r->f==1) return 1;
else return 0;
}
PS:字典树主要代码在于插入和查找。对于结构体内部,实际问题中我们可以加入更多的属性!能用tree树的时候,首先要想到map容器,这个会更加方便!