前言
Trie树,又叫前缀树,字典树,单词查找树,是由二叉树衍生出来的一种树形高级数据结构。经常用于处理字符串前缀相关的操作。本文浅析Trie树原理并给出C++代码实现。
一、Trie树原理
Trie树本质上就是一棵从二叉树衍生出来的多叉树,字符串共享前缀,相同前缀的字符串集中在Trie中的一个子树上。减少重复存储,使用较少的空间,且能够实现快速查找字符串。
Trie树节点:
Trie树实例: 白色表示val为空
二、Trie树实现(C++)
1.接口
实现几个必要的接口:
1.插入单词
2.查找单词是否存在
3.查找前缀是否存在
2.实现
先定义Trie节点:
struct Node{
bool is_end;
Node* son[26];
Node() {
is_end = false;
for (int i = 0; i < 26; i++) son[i] = NULL;
}
};
Trie实现代码如下:
class Trie {
public:
Node* root = new Node(); //根节点
Trie() {
}
void insert(string word) { //插入单词
auto p = root;
for (auto c : word) {
int u = c - 'a';
if (!p->son[u]) p->son[u] = new Node(); //如果不存在则创建节点
p = p->son[u];
}
p->is_end = true;
}
bool search(string word) { //搜索单词
auto p = root;
for (auto c : word) {
int u = c - 'a';
if (!p->son[u]) return false; //不存在
p = p->son[u];
}
return p->is_end;
}
bool startsWith(string prefix) { //查找前缀
auto p = root;
for (auto c : prefix) {
int u = c - 'a';
if (!p->son[u]) return false;
p = p->son[u];
}
return true;
}
};
总结
利用了数组+二叉树结构存储键值映射,本质为哈希操作,数组索引表示某个字符。