Trie树(字典树)相关概念以及实现和练习
文章目录
Trie树基本概述
Trie树,又称字典树或前缀树,是一种有序的、用于统计、排序和存储字符串的数据结构,它的关键字不是保存在节点中,而是由节点在树中的位置决定
一个节点的所有子孙都具有相同的前缀,也就是这个节点对应的字符串,根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才具有相关的值。
trie树最大优点是利用字符串的公共前缀来减少存储空间和查询时间,从而最大限度地减少无谓的字符串比较,非常高效。
trie的应用:单词自动补全、拼写检查、最长前缀匹配等
Trie的结点结构:
struct TrieNode
{
bool is_end; //表示是否是一个字符串的结尾
TrieNode *child[26]; //a-z 26个字母
TrieNode():is_end(false){
for(int i=0;i<26;i++)
child[i]='a'+i;
}
};
208. 实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。
示例:
Trie trie = new Trie();
trie.insert("apple");
trie.search("apple"); // 返回 true
trie.search("app"); // 返回 false
trie.startsWith("app"); // 返回 true
trie.insert("app");
trie.search("app"); // 返回 true
分析:
Trie树的单词插入:
- 构建ptr指针指向root
- 逐个遍历字符串中的各个字符
- 计算下标pos=正在遍历的字符-‘a’
- 如果ptr指向的结点的第pos个孩子为假:
- 创建该结点的第pos个孩子
- ptr指向该结点的第pos个孩子
- 标记ptr指向的结点的is_end为true
Trie树的搜索:
- 使用ptr指针指向root
- 逐个遍历字符串中的各个字符
- 计算下标pos=正在遍历的字符-‘a’
- 如果ptr指向的结点不存在,则返回false
- 否则ptr指向该结点的第pos个孩子
- 返回ptr指向的结点的is_end
Trie树搜索是否存在给定前缀:
- 与搜索思路一致,遍历每个字符,直至遍历结束。期间,如果ptr指向的结点不存在则返回false。如果遍历该前缀结束,则说明至少该前缀属于一个单词,因为如果不属于任何单词的话是没办法遍历至最后一个字母的。
struct TrieNode
{
bool is_end; //表示是否是一个字符串的结尾
TrieNode *child[26]; //位置即字符,不需要另外存储
TrieNode():is_end(false){
for(int i=0;i<26