前缀树
含义
Trie树,即前缀树,又称单词查找树或字典树,是一种树形结构。该树典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。
应用
题目:给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,求第一次出现在第几个位置。
在Trie树适用的状态下,很多情况同样可以使用hash树。但是Trie树用途更加的广泛,比如给一个字符串,要寻找有多少单词是以该字符串为前缀的问题。
代码解析
Trie树节点结构
const int branchNum = 26; // 26叉树
struct TrieNode {
bool isStr; // 标识是否是一个完整的字符串
TrieNode *next[branchNum]; // 每个字符的Trie树分支可能存在26个分支
};
Trie树插入操作
/**
* 前缀树建立的过程
*/
void Insert(TrieNode *root , const char *word){
TrieNode *location = root;
while(*word){
// 节点的子节点为空,创建一个子节点
if(location->next[*word - 'a'] == NULL){
TrieNode *newNode = new TrieNode();
newNode->isStr = false;
memset(newNode->next , NULL , sizeof(newNode->next));
location->next[*word - 'a'] = newNode;
}
location = location->next[*word - 'a']; // location指向字符串在前缀树中的位置
word++; // 当前字符在字符串中的位置
}
// 字符串已经全部添加到前缀树中,
// 标识前缀树到该节点为止为完整字符串
location->isStr = true;
}
Trie树查找操作
/**
* 遍历前缀树,查看指定字符串是否存在
*/
bool Search(TriNode *root , const char *word){
TrieNode *location = root;
while(*word && location != NULL){
location = location->next[*word - 'a'];
word++;
}
return (location != NULL && location->isStr);
}
Trie树删除操作
/**
* 删除前缀树
*/
void Delete(TrieNode *location){
for(int i = 0; i < branchNum; i++){
if

本文详细介绍了前缀树(TrieTree)的概念、应用场景及C++实现。通过节点结构、插入、查找和删除操作的解析,阐述了TrieTree的基本操作。此外,还探讨了拓展版的Trie树,增加了节点的额外信息以支持更丰富的查询功能。
&spm=1001.2101.3001.5002&articleId=95900447&d=1&t=3&u=1bc54e91f55649fc86e3c8afebdf141c)
909

被折叠的 条评论
为什么被折叠?



