Tire树(字典树、前缀树)的简介和构造

先留着填个坑,免得哪天忘记写了。。。
先把代码写下,注释以后再补,现在在等offer心焦中

namespace CjpSTL
{
    class Trie
    {
        struct Node;
        using NodePtr = Node*;

        struct Node
        {
            unordered_map<char, NodePtr> dict;

            char ch;
            bool hasVal;
            int count;
            Node(char _ch) :ch(_ch), dict(), count(1), hasVal(false) {}

        };

    public:
        Trie();

        void add(const string& str) const
        {
            auto cur = root;
            for (auto ch : str)
            {
                auto des = cur->dict.find(ch);
                if (des != cur->dict.end())
                {
                    ++cur->dict[ch]->count;
                    cur = cur->dict[ch];
                }
                else
                {
                    cur->dict[ch] = new Node(ch);
                    cur = cur->dict[ch];
                }

            }
            cur->hasVal = true;
        }
        bool find(const string& str)const
        {
            auto cur = root;
            for (auto ch : str)
            {
                auto des = cur->dict.find(ch);
                if (des != cur->dict.end())
                {

                    cur = cur->dict[ch];
                    ++cur->count;
                }
                else
                {
                    return false;
                }

            }
            return cur->hasVal;

        }
        void erase(const string& str)const
        {
            auto cur = root;
            auto pre = root;
            for (auto ch : str)
            {
                auto des = cur->dict.find(ch);
                if (des != cur->dict.end())
                {

                    pre = cur;
                    cur = cur->dict[ch];
                    --cur->count;
                }
                else
                {
                    break;
                }

            }
            cur->hasVal = false;


        }

        ~Trie();
    private:
        NodePtr root = new Node('\0');

    };

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值