字典树模板

结构:

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

你可能感兴趣的:(字典树)