字典树的背景:
数据结构:
1.数组
2.结构体(常见)
主要函数:
1.插入函数(参数:字符串)
2.查找函数(参数:字符串)
优势:
空间换时间
时间&空间复杂度:
1.时间复杂度:
表示单词的最长长度
2.空间复杂度: ,
是单词数量,
是平均单词长度
举个例子:
1.结构体:
struct node
{
int cnt;
node *nxt[ALTN];//字母表的大小,取决于题目要求
node()//构造函数
{
for(int i=0; i<26; ++i)
nxt[i]=NULL;//初始化为空
cnt=0;//标记符
}
};
2.插入函数:
void ins(char *s)
{
node *now=root;//根节点
int len=strlen(s);//字符长度
for(int i=0; i<len; ++i)//遍历
{
int c=s[i]-'a';//简化
if(now->nxt[c]!=NULL)//判断是否要建立新的子节点
{
now=now->nxt[c];
now->cnt++;
}
else
{
node *tmp=new node();
tmp->cnt=1;
now->nxt[c]=tmp;
now=now->nxt[c];
}
}
}
3.查询函数:(以CSU1115为例):
void fid(char *s)
{
node *now=root;//根节点
int len=strlen(s);
for(int i=0;i<len;++i)
{
int c=s[i]-'a';
now=now->nxt[c];
ans++;
if(now->cnt==1)
return;
}
}
4.清空链表:
void dele(node *tmp)
{
if(tmp==NULL)
return;
for(int i=0;i<ALTN;++i)
if(tmp->next[i]!=NULL)
dele(tmp->next[i]);
delete tmp;
return;
}
一些解释:
1.什么是根节点:
根节点是整颗字典树的最上层的节点,他没有任何字符,也不存在标记。
根节点在哪里定义?-->可以定义为全局变量。
eg: node *root;
根节点这样定义了以后,如果直接运行的话,就会报错。
这是因为我们虽然是定义了根节点,但是他的内存是硬件随机分配的,所以他的指针是不固定的,俗称”野指针“。
因此,我们要为他分配内存空间:
这要在main() 函数内部进行:
node *root = new node();//利用构造函数+内存分配=避免问题
2.关于标记符,因题目而异。注意审题。
3.推荐使用数组写法,使用指针容易报错。ORZ

433

被折叠的 条评论
为什么被折叠?



