C++怎么实现一个Trie树(字典树)_C++数据结构与前缀匹配算法
发布时间:2025-11-25 11:47
发布者:网络
浏览次数:Trie树通过树形结构高效实现字符串前缀匹配与查找。1. 每个节点包含26个子节点指针和一个结尾标记;2. 插入时逐字符创建路径,末尾标记isEnd;3. 查找需完整匹配且isEnd为true;4. 前缀判断只需路径存在;5. 封装为类便于操作,适用于自动补全等场景。

实现一个 Trie 树(字典树)在 C++ 中非常实用,尤其适用于字符串前缀匹配、自动补全、拼写检查等场景。Trie 树通过将字符串逐字符存储在树结构中,能高效地插入、查找和匹配具有相同前缀的单词。
基本结构设计
每个 Trie 节点包含若干子节点指针和一个标记,表示该节点是否为某个字符串的结尾。
class TrieNode {
public:
bool isEnd;
TrieNode* children[26]; // 假设只处理小写字母 a-z
<pre class="brush:php;toolbar:false;">TrieNode() {
isEnd = false;
for (int i = 0; i < 26; ++i) {
children[i] = nullptr;
}
}};
这里使用大小为 26 的指针数组来映射 'a' 到 'z'。也可以用 unordered_map
插入字符串
从根节点开始,对字符串中每个字符,计算其在数组中的索引(如 c - 'a'),若对应子节点不存在则创建新节点。遍历完所有字符后,将最后一个节点的 isEnd 设为 true。
void insert(TrieNode* root, const string& word) {
TrieNode* node = root;
for (char c : word) {
int idx = c - 'a';
if (!node->children[idx]) {
node->children[idx] = new TrieNode();
}
node = node->children[idx];
}
node->isEnd = true;
}
查找完整字符串
与插入类似,逐字符向下走。如果中途遇到空指针,说明字符串不存在;若能走完且最后一个节点的 isEnd 为 true,则存在该字符串。
美图云修
商业级AI影像处理工具
50
查看详情
bool search(TrieNode* root, const string& word) {
TrieNode* node = root;
for (char c : word) {
int idx = c - 'a';
if (!node->children[idx]) {
return false;
}
node = node->children[idx];
}
return node->isEnd;
}
判断是否存在某前缀
只需要检查能否顺着前缀的每个字符走到最后,不要求 isEnd 为 true。
bool startsWith(TrieNode* root, const string& prefix) {
TrieNode* node = root;
for (char c : prefix) {
int idx = c - 'a';
if (!node->children[idx]) {
return false;
}
node = node->children[idx];
}
return true;
}
把上面功能封装成一个类会更清晰:
class Trie {
private:
TrieNode* root;
<p>public:
Trie() {
root = new TrieNode();
}</p><pre class="brush:php;toolbar:false;">void insert(const string& word) {
TrieNode* node = root;
for (char c : word) {
int idx = c - 'a';
if (!node->children[idx]) {
node->children[idx] = new TrieNode();
}
node = node->children[idx];
}
node->isEnd = true;
}
bool search(const string& word) {
TrieNode* node = root;
for (char c : word) {
int idx = c - 'a';
if (
!node->children[idx]) {
return false;
}
node = node->children[idx];
}
return node->isEnd;
}
bool startsWith(const string& prefix) {
TrieNode* node = root;
for (char c : prefix) {
int idx = c - 'a';
if (!node->children[idx]) {
return false;
}
node = node->children[idx];
}
return true;
}};
使用示例:
Trie trie;
trie.insert("apple");
cout << trie.search("apple") << endl; // 输出 1
cout << trie.search("app") << endl; // 输出 0
cout << trie.startsWith("app") << endl; // 输出 1
基本上就这些。注意实际项目中需考虑内存释放问题,可在析构函数中递归删除所有节点。Trie 在处理大量字符串前缀时效率远高于哈希表,虽然空间开销略大,但在搜索性能上有明显优势。
以上就是C++怎么实现一个Trie树(字典树)_C++数据结构与前缀匹配算法的详细内容,更多请关注其它相关文章!
# word
# node
# app
# c++
# apple
# red
# 数据结构
# 递归
# 美图
# 链表
# 适用于
# 不存在
# 高性能
# 如何使用
# 如何实现
# 走到
# 芜湖市网站推广电话
# 安全类网站建设工程
# 网站内部优化推荐怎么做
# google引擎优化seo
# 成都网站营销与推广
# 汽车配件网站关键词优化
# 水源LOGO网站建设
# 杭州网站权重优化
# 亚博网站推广渠道
# 内蒙古网站推广建设方案





!node->children[idx]) {
return false;
}
node = node->children[idx];
}
return node->isEnd;
}
bool startsWith(const string& prefix) {
TrieNode* node = root;
for (char c : prefix) {
int idx = c - 'a';
if (!node->children[idx]) {
return false;
}
node = node->children[idx];
}
return true;
}