首页 > 其他 > 详细

trie树(字典树)

时间:2017-10-07 22:38:57      阅读:254      评论:0      收藏:0      [点我收藏+]

核心思想:

利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的

举个例子

技术分享

上图是由

  • am
  • as
  • tea
  • too
  • tooth
  • two

构成的字典树。每个节点代表的单词是从根遍历到他的路径,标黄的是当前节点存在单词

代码实现:

struct Trie{
    Trie *son[26];
    bool w;//记录当前节点是否是单词; 
}root;

基本性质:

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3. 每个节点的所有子节点包含的字符都不相同。

查询和插入

对于一个单词,我只要按照它的每个字母从根走到对应的节点,再看这个节点是否被标记为黄色就可以知道它是否出现过了。
如果没被标记,把这个节点标记为红色,就相当于插入了这个单词,这样查找和插入就可以一起实现。

代码实现:

void search(char s[]){//查找和插入 
    Trie *x=&root;
    for(int i=0;s[i];i++){
        if(x->son[s[i]-a]==NULL){//判断之前是否出现过 
            x->son[s[i]-a]=new Trie;//创建新的节点 
        }
        x=x->son[s[i]-a];
    }
    if(!x->w)sum++,x->w=1;//sum总结点数+1 
}

因为空间是动态分配的,所以用完要释放

void trie_free(Trie* x){//空间释放 
    for(int i=0;i<26;i++){
        if(x->son[i]!=NULL)trie_free(x->son[i]);//先释放子节点 
    }
    delete x;
}

 

trie树(字典树)

原文:http://www.cnblogs.com/bennettz/p/7636021.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!