C++前缀树
#include
#include
using namespace std;
//前缀树的生成
class TrieNode
{
public:
int pass;//代表经过
int end; //代表结尾
TrieNode **nexts; //标记路的数组
TrieNode()
{
pass = 0;
end = 0;
nexts = new TrieNode*[26];
}
};
class Trie :public TrieNode
{
public:
TrieNode* root;
Trie()
{
root = new TrieNode();
}
void insert(string word);
int search(string word);
int prefixNumber(string pre);
void Delete(string word);
};
void Trie::insert(string word)
{
if (word.size()<=0)
{
return;
}
char *chs;
strcpy(chs, word.c_str);
TrieNode* node = root;
node->pass++;
int index = 0;
for (int i = 0; i < word.size(); i++)
{
index = chs[i] - 'a';
if (node->nexts[index] ==NULL)
{
node->nexts[index] = new TrieNode();
}
node = node->nexts[index];
node->pass++;
}
node->end++;
}
int Trie::search(string word)
{
if (word.size <= 0)
{
return;
}
char *chs;
strcpy(chs, word.c_str);
TrieNode*node = root;
int index = 0;
for (int i = 0; i < word.size(); i++)
{
index = chs[i] - 'a';
if (node->nexts[index] == NULL)
{
return 0;
}
node = node->nexts[index];
}
return node->end;
}
int Trie::prefixNumber(string pre)
{
if (pre.size() <= 0)
{
return 0;
}
char *chs;
strcpy(chs, pre.c_str);
TrieNode*node = root;
int index = 0;
for (int i = 0; i < pre.size(); i++)
{
index = chs[i] - 'a';
if (node->nexts[index] == NULL)
{
return 0;
}
node = node->nexts[index];
}
return node->pass;
}
void Trie::Delete(string word)
{
if (word == "")
{
return;
}
char *chs;
strcpy(chs, word.c_str);
TrieNode *node = root;
TrieNode*tmp;
int index = 0;
int indext = 0;
for (int i = 0; i < word.size(); i++)
{
index = chs[i] - 'a';
tmp = node->nexts[index];
if (--node->nexts[index]->pass == 0)
{
delete node->nexts[index];
}
node = tmp;
}
node->end--;
}
int main()
{
system("pause");
return 0;
}