字典树

字典树 模版


  1. /* 
  2. 内容出处:http://www.cnblogs.com/tanky_woo/archive/2010/09/24/1833717.html 
  3. 字典树最主要的操作: 
  4.     ·每次从跟节点开始一次搜索 
  5.     ·取得要查找关键词的第一个字母,并根据该字母选择对应的子树并转到该子树继续进行检索 
  6.     ·在相应的子树上取得要查询关键词的第二个字母,并进一步选择对应的子树进行检索 
  7.     ·迭代过程 
  8.     ·在某个节点初,关键词的所有字母已被取出,则读取附在该节点上的信息,即完成查找 
  9. */  
  10.   
  11. #include <iostream>  
  12. #include<string.h>  
  13. #include<stdio.h>  
  14. #include<stdlib.h>  
  15. #define MAX 26  
  16. using namespace std;  
  17. //trie的数据结构定义  
  18. struct Trie  
  19. {  
  20.     Trie *next[MAX];  
  21.     int v;//根据需要变化  
  22. };  
  23. Trie *root;  
  24. void createTrie(char *str)  
  25. {  
  26.     int len=strlen(str);  
  27.     Trie *p=root;  
  28.     Trie *q;  
  29.     for(int i=0;i<len;i++)  
  30.     {  
  31.         int id=str[i]-'0';//询问p有指向id的值吗?  
  32.         if(p->next[id]==NULL)  
  33.         {//如果没有执行第id个的值,那么就建立一个指向第id个的值  
  34.             q=(Trie *)malloc(sizeof(Trie));  
  35.             //为这个值初始化  
  36.             q->v=1;  
  37.             //设置q这个节点的孩子节点为空  
  38.             for(int j=0;j<MAX;j++)  
  39.             {  
  40.                 q->next[j]=NULL;  
  41.   
  42.             }  
  43.             p->next[id]=q;  
  44.             //p深入一层  
  45.             p=p->next[id];  
  46.         }  
  47.         else  
  48.         {  
  49.             p->next[id]->v++;  
  50.             p=p->next[id];  
  51.         }  
  52.     }  
  53.     p->v=-1;//若为结尾,则将v改成-1表示  
  54. }  
  55. //查找  
  56. int findTrie(char *str)  
  57. {  
  58.     int len=strlen(str);  
  59.     Trie *p=root;  
  60.     for(int i=0;i<len;i++)  
  61.     {  
  62.         int id=str[i]-'0';//str为一串数字  
  63.         p=p->next[id];  
  64.         if(p==NULL)//若为空集,表示不存在以此为前缀的串  
  65.             return 0;  
  66.         if(p->v==-1)//字符集中已串是此串的前缀  
  67.             return -1;  
  68.     }  
  69.     return -1;//此串是字符集中某串的前缀  
  70. }  
  71.   
  72. int dealTrie(Trie *T)  
  73. {  
  74.     int i;  
  75.     if(T==NULL)  
  76.     {  
  77.         return 0;  
  78.     }  
  79.     for(i=0;i<MAX;i++)  
  80.     {  
  81.         if(T->next[i]!=NULL)  
  82.             dealTrie(T->next[i]);  
  83.     }  
  84.     free(T);  
  85.     return 0;  
  86. }  
  87.   
  88. int main()  
  89. {  
  90.     char word[10];  
  91.     gets(word);  
  92.     createTrie(word);  
  93.     printf("%d",findTrie(word));  
  94.     return 0;  
  95. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值