字典树的基础,以及在实际项目中对于敏感词的替换的应用

最近刷题时连续遇到两道字典树的题目,所以做一下这个数据结构的总结。

首先什么叫做字典树?

      叫     

      是  

我   想  

      看  

      听 

这种树结构并且把文字或者英文放在里面组成的叫做字典树。

那么字典树有什么用呢?

通过几道题目的练习我发现,字典树主要应用在,对于字符串的分级匹配和查询。

比如在我们如果有三句话,1:我是人,2:我是男人,3:我是中国人

如果一般的我们用三个字符串去存放他们,然后当我们要寻找在这些字符串中是否存在我是中国人的时候,那么就需要一句句匹配过来,如果有1000条这样的数据,那么匹配的速度可想而知。

当我们用字典树去存放的时候,我们可以存放成这样

           人

我  是   男   人

           中   国   人

这样我们从树的根部一直寻找下去,一个个字去寻找,如果有,那么就找下去,如果没有就不存在,这样寻找速度也是可想而知的。

然后下面是字典树在C中的定义,以及简单的应用

typedef struct Node
{
    int number;
    char word[120];
    Node *next[26];
    void init()
    {
        number = 0;
        memset(next,NULL,sizeof(next));
    }
}NODE,*PNODE;

当然一般的题目都是英文的,所以存放的是英文的字符串,所以其中的next用了26长度的数组

PNODE setNode()
{
    PNODE pNew = (PNODE) malloc(sizeof(NODE));
    pNew->init();
    return pNew;
}

创建一个新的节点

void insertNode(char st[120], int number)
{
    char temp[120];
    PNODE pNew = pHead;
    int length = strlen(st);
    int i,j;
    for (i = 0; i < length; i++)
    {
        j = st[i] - 'a';
        if(pNew->next[j] == NULL)
        {
            pNew->next[j] = setNode();
        }
        pNew = pNew->next[j];
        pNew->number += number;
        temp[i] = st[i];/*把每一段到这个节点为止的字符串赋值,并在最后赋值、0否则打印时会出错*/
        temp[i+1] = '