说明:
纯手写的代码,仅用于个人练习,不保证完全正确性,没有用对数器进行验证,拿慎选。
编译器:
Microsoft VIsual Studio 2022
代码如下:
#include <iostream>
#include <string>
class Node {//节点类
public:
int pass;
int end;
Node** next;
public:
Node() {//构造函数
pass = 0;
end = 0;
next = new Node * [26];
for (int i = 0; i < 26; ++i) {//在这里必须手动设置next[i]为nullptr,即0地址,否则随机地址无法用nullptr识别
next[i] = nullptr;
}
}
};
class TrieTree : private Node {//字典树类
private:
Node* root;
public:
TrieTree() {//构造函数
root = new Node();
}
void insertWord(const std::string& word) {//插入单词
if (word.empty()) {
std::cout << "NULL" << std::endl;
return;
}
Node* node = root;
node->pass++;
int index = 0;
for (int i = 0; i < word.size(); ++i) {
index = word[i] - 'a';
if (node->next[index] == nullptr) {
node->next[index] = new Node();
}
node = node->next[index];
node->pass++;
}
node->end++;
//std::cout << "Insert finished" << std::endl;//这里可以打印验证
}
int searchWord(const std::string& word) {//查找单词
if (word.empty()) {
std::cout << "NULL" << std::endl;
return 0;
}
Node* node = root;
int index = 0;
for (int i = 0; i < word.size(); ++i) {
index = word[i] - 'a';
if (node->next[index] == nullptr) {
return 0;
}
node = node->next[index];
}
return node->end;
}
int perfixNumber(const std::string& word) {//查找哪些单词有这个前缀
if (word.empty()) {
std::cout << "NULL" << std::endl;
return 0;
}
Node* node = root;
int index = 0;
for (int i = 0; i < word.size(); ++i) {
index = word[i] - 'a';
if (node->next[index] == nullptr) {
return 0;
}
node = node->next[index];
}
return node->pass;
}
void deleteWord(const std::string& word) {//删除单词
if (searchWord(word) != 0) {
Node* node = root;
int index = 0;
for (int i = 0; i < word.size(); ++i) {
index = word[i] - 'a';
if (--node->next[index]->pass == 0) {
destoryNode(node->next[index], word, i);
node->next[index] = nullptr;
//std::cout << "delete finished by 1" << std::endl;//这里可以打印验证
return;
}
node = node->next[index];
}
node->end--;
//std::cout << "delete finished by 2" << std::endl;//这里可以打印验证
return;
} else {
std::cout << "Word in NULL!" << std::endl;
return;
}
}
private:
void destoryNode(Node* begin, const std::string& word, const int& pos) {//递归删除begin为始的节点
if (begin == nullptr || pos >= word.size()) {
return;
}
destoryNode(begin->next[word[pos] - 'a'], word, pos + 1);
delete begin;
}
};
int main() {
TrieTree* trietree = new TrieTree();
/*
* Input you want to try
*/
std::cin.get();
return 0;
}
备注:
如有错误,欢迎指正,欢迎评论区讨论