字典树(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; }