字典树【附加Free例程】

来源:互联网 发布:淘宝店怎么快速升钻 编辑:程序博客网 时间:2024/06/08 12:44
#include <iostream>#include <string.h>using namespace std;#define points 26struct node;typedef struct node *NumTree;struct node{int count;NumTree N[points];};NumTree init(NumTree T){T=new struct node;int i;for(i=0;i<points;i++){T->N[i]=NULL;}return T;}void Insert(NumTree T,char str[]){NumTree UseNow,s;UseNow=T;int i,len;len=strlen(str);int id;for(i=0;i<len;i++){id=str[i]-'a';if(UseNow->N[id]==NULL){s=new struct node;s->count=1;int j;for(j=0;j<points;j++)s->N[j]=NULL;UseNow->N[id]=s;UseNow=UseNow->N[id];}else{UseNow->N[id]->count++;UseNow=UseNow->N[id];}}}int find(NumTree T,char str[]){int i,id;NumTree P;P=T;int len=strlen(str);for(i=0;i<len;i++){id=str[i]-'a';if(P->N[id]==NULL)return 0;elseP=P->N[id];}return P->count;}void FreeTree(NumTree T){int i;for(i=0;i<points;i++){if(T->N[i]!=NULL){FreeTree(T->N[i]);free(T->N[i]);}elsereturn;}free(T);}int main(){NumTree T=NULL;T=init(T);char str[100];while(gets(str) && str[0]!='\0')Insert(T,str);while(gets(str) && str[0]!='\0'){int sum=0;sum=find(T,str);cout<<sum<<endl;}FreeTree(T);return 0;}



FreeTree例程是我自己写的,没有办法检验,但我觉得根据递归应该把所有树都Free掉了,实际运行并没有出现问题,如果要使用本例程的人建议先检查一下哈!


如果有缺陷请留言指出!感激不尽!


以下是数组实现,思路没有改变,但是省略了Malloc的时间,直接从连续数组单元里提取ROOM。需要注意的是这种情况下Memory数组需要开的很大,不然会WA。

另外数组形式的Free例程有点不对劲···不知道为什么运行不了╮(╯▽╰)╭希望有大神指正!


当字典树超时的时候,用Memory形式存取,会减少一定时间,如果是MLE,那么可以在每一次处理完毕后Free一次字典树(不free的话,经过多次建立,会有一个以26为指数级增长的完全树,好可怕=。=)


#include <iostream>  #include <string.h>  using namespace std;  #define points 26      struct node;  typedef struct node *NumTree;    struct node  {      int count;      NumTree N[points];  };struct node Memory[100000];int ans=0;  NumTree init(NumTree T)  {      T=&Memory[ans++];      int i;      for(i=0;i<points;i++)      {          T->N[i]=NULL;      }      return T;  }    void Insert(NumTree T,char str[])  {      NumTree UseNow,s;      UseNow=T;      int i,len;      len=strlen(str);      int id;      for(i=0;i<len;i++)      {          id=str[i]-'a';          if(UseNow->N[id]==NULL)          {              s=&Memory[ans++];              s->count=1;              int j;              for(j=0;j<points;j++)                  s->N[j]=NULL;              UseNow->N[id]=s;              UseNow=UseNow->N[id];          }          else          {              UseNow->N[id]->count++;              UseNow=UseNow->N[id];          }      }  }    int find(NumTree T,char str[])  {      int i,id;      NumTree P;      P=T;      int len=strlen(str);      for(i=0;i<len;i++)      {          id=str[i]-'a';          if(P->N[id]==NULL)              return 0;          else              P=P->N[id];      }      return P->count;  }    void FreeTree()  {      int i;    for(i=0;i<ans;i++)      {free(&Memory[i].N);free(&Memory[i]);    }}      int main()  {      NumTree T=NULL;      T=init(T);      char str[100];    while(gets(str) && str[0]!='\0')          Insert(T,str);      while(gets(str) && str[0]!='\0')      {          int sum=0;          sum=find(T,str);          cout<<sum<<endl;      }  FreeTree();    return 0;  }  



0 0
原创粉丝点击