字典树(前缀树)的实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzc2608/article/details/81173450
#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct TrieNode
{
    int path;
    int end;
    vector<TrieNode*> tmap;
    TrieNode() : path(0), end(0) { for(int i = 0; i < 26; ++i)
                                    tmap.push_back(nullptr);}
};

//void printn(vector<TrieNode*> & ivec)
//{
//    for(int i = 0; i < ivec.size(); ++i)
//        if(ivec[i] == nullptr)
//            print("null\n");
//        else
//            print("%d\n", ivec[i]->path);
//}
class Tire
{
public:
    Tire() {root = new TrieNode();}
    void insertNode(string word);
    void deleteNode(string word);
    bool searchNode(string word);
    int prefixNumber(string word);
    TrieNode* getroot() { return root; }
private:
    TrieNode* root;
};
void Tire::insertNode(string word)
{
    if(word == "")
        return;
    TrieNode* node = root;
    int index = 0;
    for(int i = 0; i < word.size(); ++i)
    {
        index = word[i] - 'a';
        if(node->tmap[index] == nullptr)
        {
            TrieNode* tmp = new TrieNode();
            node->tmap[index] = tmp;
        }
        node = node->tmap[index];
        ++node->path;
    }
    ++node->end;
}
void Tire::deleteNode(string word)
{
    if(searchNode(word))
    {
        TrieNode* node = root;
        int index = 0;
        for(int i = 0; i < word.size(); ++i)
        {
             index = word[i] - 'a';
             if(node->tmap[index]->path-- == 1)
             {
                 node->tmap[index] = nullptr;
                 return;
             }
              node = node->tmap[index];
        }
        --node->end;
    }
}

bool Tire::searchNode(string word)
{
    if(word == "")
        return false;
    TrieNode* node = root;
    int index = 0;
    for(int i = 0; i < word.size(); ++i)
    {
        index = word[i] - 'a';
             if(node->tmap[index] == nullptr)
             {
                 return false;
             }
              node = node->tmap[index];
    }
    return node->end > 0;
}
int Tire::prefixNumber(string word)
{
      if(word == "")
        return 0;
    TrieNode* node = root;
    int index = 0;
    for(int i = 0; i < word.size(); ++i)
    {
        index = word[i] - 'a';
             if(node->tmap[index] == nullptr)
             {
                 return 0;
             }
              node = node->tmap[index];
    }
    return node->path;
}
int main()
{
    Tire* tree = new Tire();
    tree->insertNode("abc");
    tree->insertNode("ab");
    tree->insertNode("bc");
    tree->deleteNode("ab");
    tree->insertNode("a");

    cout << tree->searchNode("ab") << endl;
    cout << tree->prefixNumber("a") << endl;

    TrieNode* node = tree->getroot();
    cout << node->path << endl;
}

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/81173450