标签:
字典树又称为单词查找树。用于统计排序大量字符串(不限于字符串),利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。字典树的性质:
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