在计算机科学中,trie,又称前缀树或字典树,是一种有种树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
以下几个博客的讲解很详细:
1. http://blog.csdn.net/hackbuteer1/article/details/7964147
2. http://blog.csdn.net/v_july_v/article/details/6897097
3. http://blog.csdn.net/luxiaoxun/article/details/7937589
4. 《王道程序员求职宝典》 P276
使用范围:
1. 词频统计 2.前缀匹配 3.全词匹配
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 5 class Trie{ 6 public: 7 Trie(); 8 ~Trie(); 9 void Insert(const string &s); 10 bool Search(const string &s) const; 11 private: 12 struct TrieNode{ 13 int count; //单词出现的次数 14 TrieNode *next[26]; 15 bool exist; 16 17 TrieNode(): count(0), exist(false) { 18 memset(next, NULL, sizeof(next)); 19 } 20 }; 21 22 TrieNode *root_; 23 24 void MakeEmpty(TrieNode *root); 25 }; 26 27 Trie::Trie() { 28 root_ = new TrieNode(); 29 } 30 31 Trie::~Trie() { 32 MakeEmpty(root_); 33 } 34 35 void Trie::Insert(const string &s) { 36 int len = s.size(); 37 TrieNode *position = root_; 38 for (int i =0; i < len; ++i) { //不存在建立一个节点 39 if (position->next[s[i] - ‘a‘] == NULL) { 40 position->next[s[i] -‘a‘] = new TrieNode(); 41 } 42 position = position->next[s[i] - ‘a‘]; //没插入一步,相当于一个新串经过,指针要向下移动 43 } 44 45 position->count++; 46 position->exist = true; 47 } 48 49 bool Trie::Search(const string &s) const { 50 if (root_ == NULL) return false; 51 52 int len = s.size(); 53 TrieNode *location = root_; 54 for (int i = 0; i < len; ++i) { 55 if (location->next[s[i] - ‘a‘] == NULL) { 56 return false; 57 } 58 location = location->next[s[i] - ‘a‘]; 59 } 60 61 return location->exist; 62 } 63 64 void Trie::MakeEmpty(TrieNode *root) { 65 for (int i = 0; i < 26; ++i) { 66 if (root->next[i] != NULL) 67 MakeEmpty(root->next[i]); 68 } 69 70 delete root; 71 root = NULL; 72 }
时间: 2024-10-13 22:23:06