关于Trie树的模板

简介:

Trie树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 ——-百度百科
具体给出代码,这也是根据大牛们的一些代码整的,,还是太渣了。。。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
const int maxn = 26;
struct Trie//结点声明
{
    struct Trie *next[maxn];//孩子分支
    bool isStr;//标记是否构成单词
};

void Insert(Trie *root,const char *s)//将单词s插入Trie树
{
    if(root==NULL || *s=='\0')
        return;
    //int i;
    Trie *p = root;
    while(*s != '\0')
    {
        if(p->next[*s-'a'] == NULL) //如果不存在,则建立结点
        {
            Trie *tmp = (Trie*)malloc(sizeof(Trie));
            for(int i=0; i<maxn; i++)
                tmp->next[i] = NULL;
            tmp->isStr = false;
            p->next[*s-'a'] = tmp;
            p = p->next[*s-'a'];
        }
        else
            p = p->next[*s-'a'];
        s++;
    }
    p->isStr = true;//单词结束的地方标记此处可以构成一个单词
}

int Find(Trie *root, const char *s)
{
    Trie *p = root;
    while(p!=NULL && *s!='\0')
    {
        p = p->next[*s-'a'];
        s++;
    }
    return (p!=NULL && p->isStr==true);//在单词结束处的标记为true时,单词才存在
}

void Del(Trie *root)//释放整个Trie树的空间
{
    for(int i=0; i<maxn; i++)
    {
        if(root->next[i] != NULL)
            Del(root->next[i]);
    }
    free(root);
}

char s[100];
int main()
{
    int m,n; //n为建立Trie树输入的单词数,m为要查找的单词数
    Trie *root = (Trie *)malloc(sizeof(Trie));
    for(int i=0; i<maxn; i++)
        root->next[i] = NULL;
    root->isStr = false;
    scanf("%d",&n);
    getchar();
    for(int i=0; i<n; i++)//建立Trie树
    {
        scanf("%s",s);
        Insert(root,s );
    }

    while(~scanf("%d",&m))
    {
        for(int i=0; i<m; i++)
        {
            scanf("%s",s);
            if(Find(root, s) == 1)
                puts("Yes");
            else
                puts("No");
        }
        puts("");
    }
    Del(root);
    return 0;
}
目录
相关文章
|
9月前
树状数组模板
树状数组模板
48 0
|
8月前
|
Java Python
二分查找模板
二分查找模板
|
9月前
线段树模板
线段树模板
57 0
|
机器学习/深度学习
P1873 砍树(二分查找模板)
P1873 砍树(二分查找模板)
143 0
|
存储 人工智能 算法
Trie树模板与应用
Trie树模板与应用
112 0
Trie树模板与应用
洛谷—模板字典树 P8306
洛谷—模板字典树 P8306
101 0
|
算法
kmp算法模板
临近期末了,要开始复习了,先复习一下数据结构的kmp算法吧
|
存储 算法
线段树模板与练习
线段树模板与练习
113 0
|
算法
树状数组模板与练习
树状数组模板与练习
108 0
二分搜索的三种模板
二分搜索的三种模板
74 0