看了字典树之后自己编写的一个使用字典树解决的程序。其中要注意的几点是:
1. 数据0 00 000 0000等连续的零需要所做一个数据
这个数据会最终存到根节点中,因此特别需要注意的就是初始化数据。
2. 并不需要每个字符都对节点中的v加一,而仅仅到了最后的时候加一就可以,可以提高效率。
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std;
struct wtre_type{
struct wtre_type *next[10];
int v;
};
//向字典序中插入点
int maxvalue;
struct wtre_type * root;
void free_wtre(wtre_type * t)
{
if(t!=NULL)
{
for(int i=0;i<10;i++)
free_wtre(t->next[i]);
free(t);
}
}
int insert_wtr(char str[35])
{
int len = strlen(str);
int j=0;
while(str[j]=='0')j++; //找到第一个不是零的数
//printf("*%s\n",str+j);
wtre_type * p = root;
wtre_type * q = NULL;
for(;j<len;j++)
{
int index = str[j]-'0';
//printf("index=%d\n",index);
if(p->next[index]==NULL)
{
q = (wtre_type *)malloc(sizeof(wtre_type));
for(int i=0;i<10;i++)
q->next[i]=NULL;
q->v = 0;
p->next[index]=q; //初始化一个节点给这个数据
}
p=p->next[index];
}
p->v++;
//printf("p->v = %d\n",p->v);
return p->v;
}
int main()
{
int N;
while(scanf("%d",&N)!=EOF)
{
char str[35];
maxvalue = 0;
root = (wtre_type *)malloc(sizeof(wtre_type));
root->v=0;
for(int i=0;i<10;i++)
root->next[i]=NULL;
for(int i=0;i<N;i++)
{
scanf("%s",str);
int num = insert_wtr(str);
if(num>maxvalue) maxvalue = num;
}
printf("%d\n",maxvalue);
free_wtre(root);
}
return 0;
}