Trie树(字典树)c++实现

简单介绍

字典树的实现有点类似编程题目的Huffman编码。构建一个树,把要记录的值作为边,然后记录该点是否是终点,可以用来字符串去重,快速查找字符串等。
具体原理可以参考:博客链接

源码实现

#include<iostream>
#include<bits/stdc++.h>

using namespace std;

/*构建一个字典树
实现插入操作
实现查询是否存在
可以实现字符串去重(大量字符串的时候
*/
const int MaxN = 26;//每个节点最多可以有的节点数量

struct node
{
    node* next[MaxN];//用val作为下标

    int num;//孩子节点的数量
    char val;//到该节点的边

    bool root;//是否是根结点
    bool isEnd;//是否是终点

    node()
    {
        root = false;
        isEnd = false;
        num = 0;
    }
    node(char c)
    {
        val = c;
        isEnd = false;
        root = false;
        num = 0;

    }

};

//判断节点是否有c这条边
bool check(node* root, char c)
{
    if(root->next[c-'a'] != NULL)
        return true;
    return false;
}

//插入一个字符串
void Insert(node* &root, string s)
{
    node* temp = root;
    for(int i = 0; i < s.size(); i++)
    {
        //将字符串s的每一位加到树上
        if(!check(temp, s[i]))
        {
            //新增节点
            temp->next[s[i]-'a'] = new node(s[i]);
            ++temp->num;
        }
        temp = temp->next[s[i]-'a'];//从下一个节点开始找
    }
    //标记终点
    temp->isEnd = true;
}

//是否包含字符串
bool isContian(node* root, string s)
{
    for(int i = 0; i < s.size(); i++)
    {
        if(!check(root, s[i]))
            return false;
        root = root->next[s[i]-'a'];
    }
    return root->isEnd;
}



int main()
{
    node* root = new node();
    root->root = true;
    /*
        插入字符串构建字典树
        去重
        ....
    */
    Insert(root, "abcde");
    Insert(root, "aaaa");
    cout << isContian(root, "aaaa") << endl;
    cout << isContian(root, "abcd") << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值