Tire 트 리 (사전 트 리, 접두사 트 리) 의 소개 와 구조

4106 단어 데이터 구조
언제 쓰 는 것 을 잊 지 않도록 먼저 구 덩이 를 메 워 라.먼저 코드 를 쓰 고 주석 을 달 고 보충 하 겠 습 니 다. 지금 은 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');

    };

}

좋은 웹페이지 즐겨찾기