zoukankan      html  css  js  c++  java
  • 字典树

     

    字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种。用于统计,排序和保存大量的字符串(也可以保存其的)。

    优点就是利用公共的前缀来节约存储空间。在这举个简单的例子:比如说我们想储存3个单词,nyist、nyistacm、nyisttc。如果只是

    单纯的按照以前的字符数组存储的思路来存储的话,那么我们需要定义三个字符串数组。但是如果我们用字典树的话,只需要定义

    一个树就可以了。在这里我们就可以看到字典树的优势了。

    基本操作:

    1>建树

    2>查找

    3>删除即释放内存

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    bool flag;
    typedef struct node {
         int cnt;
         struct node *next[10];
         node()
         {
              memset(next,NULL,sizeof(next));
              cnt=0;
         }
    }node ;
    char s[20];
    
    void buildtrid(node *root)//建树。
    {
         node *p=root;
         int l=strlen(s);
         node *tmp;
         for(int i=0;i<l;i++)
         {
              if(p->next[s[i]-'0']==NULL)
              {
                   tmp=new node;
                   p->next[s[i]-'0']=tmp;
              }
              p=p->next[s[i]-'0'];     //插入的单词是否有前缀
              if(p->cnt!=0)
                   flag=false;
         }
         for(int i=0;i<10;i++)//判断插入的单词是否为其他的前缀。。
              if(p->next[i]!=NULL)
              {
                   flag=false;
                   break;
              }
         p->cnt++;
    }
    void del(node *root)//删除多余的节点,并赋值为NULL
    {
         for(int i=0;i<10;i++)
         {
              if(root->next[i])
              {
                   del(root->next[i]);
                   root->next[i]=NULL;
              }
         }
         delete root;
    }
    
    
    int Search(node *root,char *s)//查找
    {  
        node *p=root;  
        for(int i=0;s[i];i++){  
            int x=s[i]-'a';  
            if(p->next[x]==NULL) 
            return 0;  
            p=p->next[x];  
        }  
        return p->num;  
    }  
    
    int main()
    {
         int n,m;
         scanf("%d",&n);
         while(n--)
         {
              flag=true;
              node *root=new node;
              scanf("%d",&m);
              while(m--)
              {
                   scanf("%s",s);
                   if(!flag)continue;
                   buildtrid(root);
              }
              if(flag)
                   printf("YES
    ");
              else
                   printf("NO
    ");
              del(root);
         }
         return 0;
    }
  • 相关阅读:
    QSet<T>自定义类型需要定义==和qHash()函数
    《左耳听风》-ARTS-打卡记录-第十三周
    Windows中对窗口进行剪切
    Markdown 编写规范
    【洛谷 P1033】自由落体
    【GOJ 3032】司愁之路
    动态规划基础 3-解题报告
    前缀、中缀、后缀互相转换
    【GOJ 3015】疯狂外星人
    【GOJ 3010】有趣的数
  • 原文地址:https://www.cnblogs.com/WDKER/p/5501774.html
Copyright © 2011-2022 走看看