【学习笔记】关于字典树
字典树是一种特殊的树,以下函数是特别保存的留作以后备用的函数。
也是以结点的形式来构建树,结构体如下:
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 ; } }