字典树(Trie树)模板

结构:

struct node

{

    int flag;

    node *next[27];

}*head;

生成节点:

/*动态分配内存*/

node * newnode()

{

    int i;

    node * p = new node;    // c语言用(node * )malloc(sizeof(node), 这里是动态分配内存,时间上可能消耗的多一些

    p->flag = 0;

    for(i = 0; i < 26; i++)

        p->next[i] = NULL;

    return p;

}



/*静态分配内存*/

node T[1000000];

int t = 0;

node * newnode()

{

    int i;

    node * p = &T[t++];  

    p->flag = 0;

    for(i = 0; i < 26; i++)

        p->next[i] = NULL;

    return p;

}



注意:

1:在此之前head一定要先分配,否则无法执行,这里自己老是出错。

2:还有如果处理多组数据的话一定要注意清空T[]数组,否则影响后边的处理。

插入操作:

void insert(char *s)

{

    int i,k;

    int len = strlen(s);

    node *p = head;

    for (i = 0; i < len; ++i)

    {

        k = s[i] - 'a';

        if (p->next[k] == NULL)

        p->next[k] = newnode();

        p = p->next[k];

    }

    p->flag = 1;

}

查找操作:

bool search(char *s)

{

    int i,k;

    int len = strlen(s);

    node *p = head;

    for (i = 0; i < len; ++i)

    {

        k = s[i] - 'a';

        if (p->next[k]) p = p->next[k];

        else

        return false;

    }

    if (p->flag) return true;

    else return false;

}

程序完毕后释放内存函数:

void del(node * p)

{

    int i;

    if(p)                   //p不为空

    {

        for(i =0; i <26; i++)

            if(p->next[i])

                del(p->next[i]);        //递归删除每一个p->next[]

    }

    free(p);

    p = NULL;        

}

  

你可能感兴趣的:(trie)