字典树是一种特殊的树,以下函数是特别保存的留作以后备用的函数。
也是以结点的形式来构建树,结构体如下:
typedef struct node
{
int a;
struct node *next[26];
} tree,*tr;
建立字典树的函数,返回值是树根的地址,由此字符串时键鼠并标记为1。
tr build (tr t,char *s,int p)
{
tr pi=t,pj;
int i,j,d;
if(t==NULL)
{
pi=(tr)malloc(sizeof(tree));
for(i=0; i<26; i++)
{
pi->next[i]=NULL;
}
t=pi;
}
for(i=0; i<p-1; i++)
{
if(*(s+i)-'a'<0)
{
d=*(s+i)-'a'+32;
}
else
{
d=*(s+i)-'a';
}
if(pi->next[d]==NULL)
{
pj=(tr)malloc(sizeof(tree));
pi->next[d]=pj;
pi=pj;
for(j=0; j<26; j++)
{
pi->next[j]=NULL;
}
}
else
{
pi=pi->next[d];
}
}
if(*(s+p-1)-'a'<0)
{
d=*(s+p-1)-'a'+32;
}
else
{
d=*(s+p-1)-'a';
}
if(pi->next[d]==NULL)
{
pj=(tr)malloc(sizeof(tree));
pi->next[d]=pj;
pi=pj;
for(j=0; j<26; j++)
{
pi->next[j]=NULL;
}
pi->a=1;
}
else
{
pi=pi->next[d];
pi->a=1;
}
return t;
}
注意:在建立树的时候,一定把多余的没有存放地址的指针赋值为NULL!!!
字典树使用完后的释放内存函数,这个函数视情况使用因为比较费时。
void free1(tr t)
{
int i;
for(i=0;i<26;i++)
{
if(t->next[i])
{
free1(t->next[i]);
}
}
free(t);
}
在字典树中删除字符串的函数,但这里没有删掉那些多余的结点。
void del (tr t,char *s,int p)
{
tr pi=t,pj;
int i,j,d;
for(i=0; i<p-1; i++)
{
if(*(s+i)-'a'<0)
{
d=*(s+i)-'a'+32;
}
else
{
d=*(s+i)-'a';
}
if(pi->next[d])
{
pi=pi->next[d];
}
else
{
return ;
}
}
if(*(s+i)-'a'<0)
{
d=*(s+p-1)-'a'+32;
}
else
{
d=*(s+p-1)-'a';
}
if(pi->next[d])
{
pi=pi->next[d];
if(pi->a==1)
{
count--;
pi->a=0;
}
}
else
{
return ;
}
}