【ACM】字典树

字典树,Trie树,是一种树形结构,是一种哈希树的变种,典型功能是用于统计,排序和保存大量的字符串。优点是:利用字符串的公共前缀来节约存储空间,最大限度的减少无谓的字符串的比较。

代码模板:

#define maxn 26 //由题目的字符总数决定

typedef struct TrieNode
{
    bool isStr;
    struct TrieNode *next[maxn];
} Trie;

void insertTrie(Trie *root , const char *str)
{
    if(root == NULL || *str =='\0')
        return ;
    Trie *p = root ;
    while(*str != '\0')
    {
        int id = *str - 'a';
        if(p->next[id] == NULL)
        {
              Trie *temp = (Trie *)malloc(sizeof(Trie));
              for(int i=0;i<maxn;i++)
              {
                  temp->next[i] = NULL;
              }
              temp->isStr = false;
              p->next[id] = temp;
              p = p->next[id];
        }
        else
        {
            p = p->next[id];
        }
        str++;
    }
    p->isStr = true;
}

int searchTrie(Trie *root , const char *str)
{
    Trie *p = root;
    int len = strlen(str);
    for(int i=0;i<len;i++)
    {
        if(p->isStr == false && p->next[*str-'a'] == NULL)
            return 0;
        if(p->next[*str-'a']->isStr == true)
            return 1; //已经存在str的子串
        p=p->next[*str-'a'];
        str++;
    }
    return 2;
}

void dealTrie(Trie *root)
{
    //先对一个结点递归的查找maxn个子树,遍历完成后,释放根树内存
    for(int i=0;i<maxn;i++)
    {
        if(root->next[i] != NULL)
        {
            dealTrie(root->next[i]);
        }
    }
    free(root);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值