版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}