标签:
字典树又称为单词查找树。用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。字典树的性质:
1.根节点不包含任何字符(空根节点)
2.从根节点到某一节点路径上的字符连起来就是一个字符串
3.每个节点的所有子节点包含的字符串不相同。
一般的每一个节点需要一个统计量count,来记录当前前缀重复的次数。每个节点还可以用一个布尔变量标记当前节点是否构成单词。Trie主要操作有插入单词,删除单词,查找单词。
#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
using namespace std;
int const MAXN = 26;
struct TrieNode{
TrieNode(){ //构造函数,包含初始化
memset(next, 0, sizeof(next));
exist = false;
count = 0;
}
TrieNode*next[MAXN];
bool exist; //记录当前节点是否构成单词
int count; //记录当前前缀重复次数
};
TrieNode *root = new TrieNode;
void Insert(char *str){
TrieNode*p = root;
while (*str != ‘\0‘){
int id = *(str++) - ‘a‘;
if (p->next[id] == NULL)
p->next[id] = new TrieNode;
p = p->next[id];
p->count++;
}
p->exist = true; //串的最后一个节点标志为构成单词
}
//查询单词
bool Search(char*str){
TrieNode*p = root;
while (*str != ‘\0‘){
int id = *(str++) - ‘a‘;
if (p->next[id] == NULL) //节点不存在
return NULL;
p = p->next[id];
}
return p->exist; //返回是否存在单词
}
//删除一个单词
void Delete(char*str){
//确保树中原来一定含该单词
TrieNode*p = root;
while (*str != ‘\0‘){
int id = *(str++) - ‘a‘;
p = p->next[id];
p->count--;
}
p->exist = false; //串的最后一个节点标志为构
}
//删除一颗字典树
void Delete(TrieNode*T){
if (T){
for (int i = 0; i < MAXN; i++)
Delete(T->next[i]);
free(T);
T = NULL;
}
}
标签:
原文地址:http://www.cnblogs.com/td15980891505/p/5745959.html