字典树

字典树:

以下是官方解释

字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。
实现方法:
搜索字典项目的方法为:
(1) 从根结点开始一次搜索;
(2) 取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索;
(3) 在相应的子树上,取得要查找关键词的第二个字母,并进一步选择对应的子树进行检索。
(4) 迭代过程……
(5) 在某个结点处,关键词的所有字母已被取出,则读取附在该结点上的信息,即完成查找。
其他操作类似处理

开始贴代码

这个是起始时:

#define MAX 256//ascii码有256个字符,故每棵树的子节点最多有256个
#define MAXLEN 256//单词最长为256

typedef struct TrieNode
{
    int count;
    struct TrieNode *next[MAX];
}TrieNode;  

重点看一哈这个插入函数,这个思想有点趣;

void Insert(char *word,TrieNode *root)

{
    int i;
    TrieNode *cur;
    if(word[0]=='\0')//字符 与 数字的转化 ,通过Ascal 码表
        return;
    cur=root;
    for(i=0;word[i]!='\0';i++)
    {
        if(cur->next[word[i]]==NULL)
        {
            TrieNode *newNode = (TrieNode *)malloc(sizeof(TrieNode));
            memset(newNode,0,sizeof(TrieNode));
            cur->next[word[i]]=newNode;
        }
        cur=cur->next[word[i]];
    }

    cur->count++;//单词结束的地方放一个**标志**,表示从根节点遍历到这就是一个单词
    return;
}
//所以思想就是把单词一个一个字母,然后拆开一个一个的存到树里,注意**字母是什么是靠孩子节点编号通过Acscal吗表转来的**,一个父节点下面的最多有256个孩子。

下面是其他函数

//插入一个单词



//创建树输入每个单词,以回车结束,则单词被插入树中,碰到*停止树的创建

void Construct(TrieNode *&root)
{
     char inStr[MAXLEN];
     int size=0;
     root = (TrieNode *)malloc(sizeof(TrieNode));
     memset(root,0,sizeof(TrieNode));
     while(1)
     {
         scanf("%s",inStr);
         if(strcmp(inStr,"*")==0)
             break;
         Insert(inStr,root);
     }
     return;
}


//遍历整棵树

void Traverse(TrieNode *curP)
{
    static char theWord[MAXLEN];
    static int pos=0; 
    int i;
    if(curP==NULL)
        return;
    if(curP->count)
    {
        theWord[pos]='\0';
        printf("%s:%d\n",theWord,curP->count);
    }
    for(i=0;i<MAX;i++)
    {
        theWord[pos++]=i; 

//从这句话可以看出在递归调用子节点前,子节点的值已经加入到单词中了

        Traverse(curP->next[i]); 
        pos--;  
    }
    return;
}


//查找一个单词是不是在树中

bool Find(TrieNode *root,char *word)
{
    int i;
    TrieNode *cur;
    cur=root;
    for(i=0;word[i]!='\0';i++)
    {
        if(cur->next[word[i]]==NULL)
        {
            return false;
        }
        cur=cur->next[word[i]];
    }

    if(cur->count)
        return true;
    else
        return false;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值