字典树
一 简介
字典树(单词查找树),是一种树形结构,应用于统计、排序和保存大量字符串。优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无畏字符串的比较,查询效率高于哈希树。
二 基本结构
字典树与字典很相似,当你要查一个单词是不是在字典树中,首先看单词的第一个字母是不是在字典的第一层,如果不在,说明字典树里没有该单词,如果在就在该字母的孩子节点里找是不是有单词的第二个字母,没有说明没有该单词,有的话用同样的方法继续查找.字典树不仅可以用来储存字母,也可以储存数字等其它数据。因此构造字典树和查询的思路一致:从单词的第一个字母开始,看是否存在,如果存在,接着看第二个字母,否则,创建一个新的分支节点直至最后一个字母。
三 代码实现
//定义节点结构
const int maxsize = 26;
typedef struct TrieNode
{
bool isStr;
TrieNode* next[maxsize];
TrieNode() :isStr(false)
{
memset(next, NULL, sizeof(next));
}
};
class Trie
{
private:
TrieNode* root;
public:
Trie()
{
root = new TrieNode();
}
void insert(const string& s);
bool search(const string& str);
TrieNode* getRoot()
{
return root;
}
void deleteTrie(TrieNode* root);
};
void Trie::insert(const string& s)
{
const int n = s.size();
TrieNode* p = root;
for (int i = 0; i < n; ++i)
{
if (p->next[s[i] - 'a'] == NULL)
{
TrieNode* tmp = new TrieNode();
p->next[s[i] - 'a'] = tmp;
}
p = p->next[s[i] - 'a'];
}
p->isStr = true;
}
bool Trie::search(const string& str)
{
const int n = str.size();
TrieNode* p = root;
for (int i = 0; i < n; ++i)
{
if (p->next[str[i] - 'a'] != NULL)
{
p = p->next[str[i] - 'a'];
continue;
}
else
return false;
}
return (p!=NULL)&&(p->isStr);
}
void Trie::deleteTrie(TrieNode* root)
{
if (root != NULL)
{
for (int i = 0; i < maxsize; ++i)
{
if (root->next[i] != NULL)
{
deleteTrie(root->next[i]);
}
}
delete root;
}
}