字典树入门

字典树入门,包括建树,插入以及查找

我的算法知识太差,有待提高,多看多练

描述:建立一个词库,输入若干个单词,输入以0结束

   可以查询单词,返回他在词库中出现的次数,(ps:作为某个词的前缀时也算出现一次)

/*
    本来以为字典树挺难的,结果看了之后感觉基础还是挺简单的
    下面算法算出建立一棵字典树,输入为0表示结束
    输入要查询的单词,返回字典树中这个词出现的频率
*/
#include <stdio.h>
#define MAX 26 //英文字母的个数
//定义字典树的节点的数据类型
typedef struct TrieNode
{
    int nCount;//存储改节点前缀出现次数
    struct TrieNode *next[MAX];//该节点的后续节点
}TrieNode;

//定义存储节点的数组
TrieNode Memory[1000000];//定义一个存储字典树节点的数组
int allocp = 0;//可以看到用到下标为几的节点了,创建节点的时候用

//创建字典树
TrieNode *CreatTrie()
{
    TrieNode *tmp = &Memory[allocp++];//tmp是指向树根的指针
    tmp->nCount = 1;
    for(int i = 0; i < 26; i++)
        tmp->next[i] = NULL;//每次创建节点之后树根下面都是空的
    return tmp;//返回所建立的数的树根,改树根是谁的子树,返回值就赋给谁的成员
}

//在字典树中插入字符串
void InsertTrieTree(TrieNode **root, char *str)
{
    TrieNode *tmp = *root;
    int i = 0, k;
    while(str[i])
    {
        k = str[i] - 'a';//0-25分别代表26个英文字母
        if(tmp->next[k])//如果这个词中的某个字母在相应位置出现过,
        {               //那么相应位置的前缀数目就加1
            tmp->next[k]->nCount++;
        }
        else//如果这个词在相应位置没有出现过,就在树中的相应位置加上该节点
        {
            tmp->next[k] = CreatTrie();
        }
        i++;
        tmp = tmp->next[k];
    }
}

//查询一个字符串,返回字符串在字典中出现的次数
int SearchTrieTree(TrieNode **root, char *str)
{
    TrieNode *tmp = *root;
    int i = 0, k;
    while(str[i])
    {
        k = str[i] - 'a';
        if(tmp->next[k])
            tmp = tmp->next[k];
        else
            return 0;
        i++;
    }
    return tmp->nCount;z
}

int main()
{
    char s[11];
    TrieNode *root = CreatTrie();
    while(gets(s) && s[0] != '0')
    {
        InsertTrieTree(&root, s);
    }
    while(gets(s))
    {
        printf("%d
", SearchTrieTree(&root, s));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/rain-1/p/5027882.html