字典树的细节

字典树的背景:

字典树

数据结构:

1.数组

2.结构体(常见)

主要函数:

1.插入函数(参数:字符串)

2.查找函数(参数:字符串)

优势:

空间换时间

时间&空间复杂度:

1.时间复杂度: O(MAX(S))   MAX(S)表示单词的最长长度

2.空间复杂度:O(N*LEN) ,N是单词数量,LEN是平均单词长度

举个例子:

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; inxt[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;inxt[c];
        ans++;
        if(now->cnt==1)
            return;
    }
}

4.清空链表:

void dele(node *tmp)
{
    if(tmp==NULL)
        return;
    for(int i=0;inext[i]!=NULL)
            dele(tmp->next[i]);
    delete tmp;
    return;
}

一些解释:

1.什么是根节点:

根节点是整颗字典树的最上层的节点,他没有任何字符,也不存在标记。

根节点在哪里定义?-->可以定义为全局变量。

eg: node *root;

根节点这样定义了以后,如果直接运行的话,就会报错。

这是因为我们虽然是定义了根节点,但是他的内存是硬件随机分配的,所以他的指针是不固定的,俗称”野指针“。

因此,我们要为他分配内存空间:

这要在main() 函数内部进行:

node *root = new node();//利用构造函数+内存分配=避免问题

2.关于标记符,因题目而异。注意审题。

3.推荐使用数组写法,使用指针容易报错。ORZ

你可能感兴趣的:(字典树)