【学习笔记】关于字典树

字典树是一种特殊的树,以下函数是特别保存的留作以后备用的函数。

也是以结点的形式来构建树,结构体如下:

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 ;
    }

}



posted @ 2013-02-20 15:17  、小呆  阅读(101)  评论(0编辑  收藏  举报