#include <iostream>
#include <string>
using namespace std;
class TrieTree{
struct TrieNode{
bool isStr;
TrieNode* child[26];
TrieNode():isStr(false){
for (int i = 0; i < 26; i++)
child[i] = NULL;
}
};
TrieNode* root;
public:
TrieTree();
~TrieTree();
void insert(string str);
void remove(string str);
bool search(string str);
};
TrieTree::TrieTree()
{
root = new TrieNode();
}
void TrieTree::insert(string str)
{
int index = 0;
TrieNode *pNode = root;
while (index < str.size()){
if (pNode->child[str[index]-'a'] == NULL){
pNode->child[str[index] - 'a'] = new TrieNode();
}
pNode = pNode->child[str[index] - 'a'];
index++;
}
pNode->isStr = true;
}
void TrieTree::remove(string str)
{
bool isLeaf = true;
int index = 0;
TrieNode *pPre = NULL;
TrieNode *pNode = root;
while (index < str.size() && pNode){
pPre = pNode;
pNode = pNode->child[str[index] - 'a'];
index++;
}
if (pNode){
for (int i = 0; i < 26; i++){
if (pNode->child[i]){
isLeaf = false;
break;
}
}
if (pPre&&isLeaf){
delete pNode;
pPre->child[str[index - 1] - 'a'] = NULL;
}
else{
pNode->isStr = false;
}
}
}
bool TrieTree::search(string str)
{
int index = 0;
TrieNode *pNode = root;
while (index<str.size()&&pNode){
pNode = pNode->child[str[index] - 'a'];
index++;
}
if (pNode&&pNode->isStr)
return true;
return false;
}
TrieTree::~TrieTree()
{
}
int main(void)
{
TrieTree tree;
tree.insert("a");
tree.insert("abcd");
tree.insert("ab");
tree.insert("bd");
tree.insert("bcd");
tree.insert("bdcc");
tree.insert("b");
tree.insert("");
tree.remove("abcde");
cout << tree.search("ba") << endl;
return 0;
}
最简单的trie树
最新推荐文章于 2024-08-21 20:15:07 发布