C++怎么实现一个Trie树(字典树)_C++数据结构与前缀匹配算法

Trie树通过树形结构高效实现字符串前缀匹配与查找。1. 每个节点包含26个子节点指针和一个结尾标记;2. 插入时逐字符创建路径,末尾标记isEnd;3. 查找需完整匹配且isEnd为true;4. 前缀判断只需路径存在;5. 封装为类便于操作,适用于自动补全等场景。

c++怎么实现一个trie树(字典树)_c++数据结构与前缀匹配算法

实现一个 Trie 树(字典树)在 C++ 中非常实用,尤其适用于字符串前缀匹配、自动补全、拼写检查等场景。Trie 树通过将字符串逐字符存储在树结构中,能高效地插入、查找和匹配具有相同前缀的单词。

基本结构设计

每个 Trie 节点包含若干子节点指针和一个标记,表示该节点是否为某个字符串的结尾。

class TrieNode {public:    bool isEnd;    TrieNode* children[26]; // 假设只处理小写字母 a-z
TrieNode() {    isEnd = false;    for (int i = 0; i < 26; ++i) {        children[i] = nullptr;    }}

};

这里使用大小为 26 的指针数组来映射 'a' 到 'z'。也可以用 unordered_map 来支持更多字符类型,更灵活但稍慢。

插入字符串

从根节点开始,对字符串中每个字符,计算其在数组中的索引(如 c - 'a'),若对应子节点不存在则创建新节点。遍历完所有字符后,将最后一个节点的 isEnd 设为 true。

立即学习“C++免费学习笔记(深入)”;

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,则存在该字符串。

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;

public:Trie() {root = new TrieNode();}

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;     // 输出 1cout << trie.search("app") << endl;       // 输出 0cout << trie.startsWith("app") << endl;   // 输出 1

基本上就这些。注意实际项目中需考虑内存释放问题,可在析构函数中递归删除所有节点。Trie 在处理大量字符串前缀时效率远高于哈希表,虽然空间开销略大,但在搜索性能上有明显优势。

以上就是C++怎么实现一个Trie树(字典树)_C++数据结构与前缀匹配算法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486000.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
C++怎么实现一个Base64编码解码器_C++数据编码与位运算实践
上一篇 2025年12月19日 09:25:12
C++如何实现一个迭代器模式_C++在不暴露内部表示的情况下遍历聚合对象
下一篇 2025年12月19日 09:25:28

相关推荐

  • JavaFX应用使用GluonFX打包为原生镜像时全屏功能异常的解决方案

    本文探讨了JavaFX应用在使用GluonFX打包为原生镜像(.exe)后,调用stage.setFullScreen(true)时抛出ClassNotFoundException的问题。该异常通常是由于GraalVM原生编译过程中未能正确包含反射调用的内部JavaFX类所致。文章提供了两种解决方案…

    2026年10月3日
    100
  • AI原生聊天软件:开发新范式!

    AI原生聊天软件:开发新范式!AI原生聊天软件:开发新范式!AI原生聊天软件:开发新范式!AI原生聊天软件:开发新范式!

    在全新的构建理念——“ai原生”(ai-native)应运而生。对于聊天软件领域而言,这不再仅仅是为现有应用添加一个智能聊天机器人,而是从底层逻辑开始,重新构想和设计以人工智能为核心驱动力的ai原生聊天软件。本文将深入探讨这一开发新范式的内涵与实施路径。 一、 何为“AI原生”?与传统开发的本质区别…

    2026年10月3日 • 用户投稿
    1800
  • win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法

    win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法

    首先检查账户是否为Microsoft账户,若为本地账户需切换;接着确保凭据管理器和Windows生物特征服务已启动;运行sfc /scannow修复系统文件;删除NGC文件夹重置PIN环境;最后通过注册表启用域PIN登录,重启后即可恢复PIN功能。 如果您在登录Windows 11时遇到PIN码不可…

    2026年10月3日 • 用户投稿
    500
  • 怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南

    怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南怎么用豆包AI帮我写分布式系统代码 分布式系统代码的AI编写指南

    豆包ai虽非专业代码生成工具,但在编写分布式系统方面可提供有效辅助。1. 可生成基础结构代码,如服务注册、配置中心等模块,需明确技术栈并提出具体问题;2. 可分析已有代码逻辑,指出潜在问题,但需分段提问并标明重点;3. 可解释分布式相关概念和设计模式,帮助理解后再实践;4. 使用时应多轮对话、结合文…

    2026年10月3日 • 用户投稿
    100
  • 红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤

    红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤

    开通红果漫剧VIP会员可通过三种方式:一、App内购,登录后进入个人中心选择会员时长并支付;二、官网开通,登录官网选择套餐完成支付;三、兑换码激活,获取有效码后在兑换页面输入并确认,权益即时生效。 如果您在使用红果漫剧时希望解锁更多专属内容和特权,可能需要开通VIP会员服务。以下是开通红果漫剧VIP…

    2026年10月3日 • 用户投稿
    900
  • 如何解读Windows事件查看器中的错误和警告日志以诊断系统问题?

    答案是Windows事件查看器通过记录系统、应用程序和服务日志,帮助快速定位问题根源。需重点关注“系统”和“应用程序”日志中的“错误”与“警告”级别事件,结合事件ID、来源和时间戳分析,如事件ID1001、7031,来源Service Control Manager或Application Erro…

    2026年10月3日
    000
  • 计算 Spring Data JPA 中 SUM() 的最佳实践

    计算 Spring Data JPA 中 SUM() 的最佳实践计算 Spring Data JPA 中 SUM() 的最佳实践计算 Spring Data JPA 中 SUM() 的最佳实践计算 Spring Data JPA 中 SUM() 的最佳实践

    本文将介绍如何在 Spring Data JPA 中使用 SUM() 函数来获取数据库表中指定字段的总和。正如摘要所述,我们可以通过自定义查询来实现这一目标,从而避免编写复杂的原生 SQL 语句,并提高代码的可读性和可维护性。 Spring Data JPA 提供了强大的查询构建能力,允许我们通过接…

    2026年10月3日 • 用户投稿
    100
  • PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python。编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的。所以今天根据PEP8整理了一份,以后都照此编码了,还会持续更新。 一 代码编排 1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不…

    用户投稿 2026年10月3日
    100
  • 使用 Spring Data JPA 获取 SUM() 结果

    使用 Spring Data JPA 获取 SUM() 结果使用 Spring Data JPA 获取 SUM() 结果使用 Spring Data JPA 获取 SUM() 结果使用 Spring Data JPA 获取 SUM() 结果

    本文介绍了如何在 Spring Data JPA 中使用 SUM() 函数来计算数据库表中特定列的总和。通过自定义查询并结合 @Query 注解,可以方便地实现聚合操作,避免编写复杂的原生 SQL 语句,充分利用 JPA 的优势。 在 Spring Data JPA 中,我们经常需要进行聚合操作,例…

    2026年10月3日 • 用户投稿
    100
  • laravel怎么对上传的文件进行MIME类型验证_laravel文件上传MIME类型验证方法

    可通过Laravel的mimetypes和mime规则校验文件MIME类型以限制上传,如’image/jpeg,image/png’;结合Fileinfo扩展手动检测真实类型,并创建自定义验证规则ValidImageMimeType提升复用性。 如果您在使用 Laravel …

    2026年10月3日
    200
  • 如何在mysql中优化缓存使用

    答案:MySQL缓存调优核心是配置InnoDB缓冲池、关闭查询缓存、合理设置表缓存。应将innodb_buffer_pool_size设为内存50%~70%,启用多个buffer pool实例,关闭query_cache减少锁争用,调大table_open_cache和table_definitio…

    2026年10月3日
    100
  • 《星空》再续命!粉丝担心《上古卷轴6》恐受影响

    《星空》再续命!粉丝担心《上古卷轴6》恐受影响《星空》再续命!粉丝担心《上古卷轴6》恐受影响《星空》再续命!粉丝担心《上古卷轴6》恐受影响《星空》再续命!粉丝担心《上古卷轴6》恐受影响

    根据外媒Comicbook的最新消息,随着贝塞斯达游戏工作室发布关于《星空》的更新动态,《上古卷轴6》的粉丝群体开始感到不安。 自2018年贝塞斯达首次公布《上古卷轴6》以来,已经过去了整整七年。当时过早地公开这款备受期待的RPG项目,如今看来似乎成了一把双刃剑——七年中几乎未有任何实质进展披露。这…

    2026年10月3日 • 用户投稿
    200
  • 解锁机皇实力:凯度W5S微蒸烤炸炖一体机,到底多牛?

    解锁机皇实力:凯度W5S微蒸烤炸炖一体机,到底多牛?解锁机皇实力:凯度W5S微蒸烤炸炖一体机,到底多牛?解锁机皇实力:凯度W5S微蒸烤炸炖一体机,到底多牛?解锁机皇实力:凯度W5S微蒸烤炸炖一体机,到底多牛?

    功能集成已成为家电行业发展的主流方向,电视、空调、冰箱、扫地机器人、洗碗机等各类家电不断融合更多实用功能。在这一趋势推动下,蒸烤一体机应运而生。随着消费者对厨房电器在功能整合与空间利用方面提出更高要求,微波功能也被引入其中,微蒸烤一体机逐渐成为市场新宠。 近年来,众多品牌纷纷推出创新科技产品,展现了…

    2026年10月3日 • 用户投稿
    000
  • 为什么硬盘文件无法打开?数据恢复的应急措施是什么?

    为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?为什么硬盘文件无法打开?数据恢复的应急措施是什么?

    硬盘文件无法打开时,应立即停止使用并断电,判断是否为文件系统错误或硬件损坏,优先尝试外部连接、磁盘管理检查及数据恢复软件扫描,避免写入新数据,重要数据建议直接寻求专业帮助。 当你的硬盘文件突然无法打开,这通常预示着一个潜在的问题,它可能只是一个简单的软件小故障,也可能是更严重的硬件损坏。面对这种情况…

    2026年10月3日 • 用户投稿
    800
  • 详解win10出现800703f1错误代码提示的解决方法

    详解win10出现800703f1错误代码提示的解决方法详解win10出现800703f1错误代码提示的解决方法详解win10出现800703f1错误代码提示的解决方法详解win10出现800703f1错误代码提示的解决方法

    win10系统时目前用户安装使用率比较高的一款操作系统,而win10系统也在针对给用户更好的使用体验,不断的在优化系统,发布更新。而最近有用户在win10更新升级的时候,出现了800703f1错误代码的提示。到底这是怎么一回事呢?该如何解决这一问题?此文黑鲨小编就为大家带来win10出现800703…

    2026年10月3日 • 用户投稿
    100
  • SparkStreaming如何解决小文件问题

    SparkStreaming如何解决小文件问题SparkStreaming如何解决小文件问题SparkStreaming如何解决小文件问题SparkStreaming如何解决小文件问题

    在使用sparkstreaming进行实时计算并将结果写入hdfs时,常见的问题是会产生大量的小文件。这是由于sparkstreaming的微批处理模式和dstream(rdd)的分布式(partition)特性所导致的。每个partition会启动一个独立的线程来处理数据,导致每个batch的每个…

    2026年10月3日 • 用户投稿
    100
  • safari浏览器隐私报告是什么意思_safari浏览器隐私报告功能说明

    隐私报告功能可展示Safari拦截的跟踪活动,通过智能防跟踪技术在设备端识别并阻止跨站跟踪器,同时支持隐藏IP地址和监测密码安全,保护用户隐私。 如果您在使用Safari浏览器时注意到“隐私报告”功能,但不清楚其具体含义和作用,该报告旨在向您透明地展示浏览器为您拦截的跟踪活动。以下是关于此功能的详细…

    2026年10月3日
    100
  • OneDrive如何设置同步频率_OneDrive同步频率调整教程

    OneDrive如何设置同步频率_OneDrive同步频率调整教程OneDrive如何设置同步频率_OneDrive同步频率调整教程OneDrive如何设置同步频率_OneDrive同步频率调整教程OneDrive如何设置同步频率_OneDrive同步频率调整教程

    OneDrive同步延迟可通过修改注册表将同步间隔设为5分钟、启用文件随选功能、手动触发同步及调整组策略来优化,提升实时性。 如果您发现OneDrive文件同步存在延迟,导致本地更改未能及时上传到云端,可能是由于默认的同步频率设置不够频繁。调整同步频率可以提升文件同步的实时性,确保数据及时备份和共享…

    2026年10月3日 • 用户投稿
    100
  • sublime怎么运行c#

    sublime怎么运行c#sublime怎么运行c#sublime怎么运行c#sublime怎么运行c#

    要在 Sublime 中运行 C# 代码,请执行以下步骤:安装 Mono(.NET 实现)。安装 C# 编译器(csc)。为 Sublime 安装 C# 插件(“C# Complete”)。创建并保存一个 .cs 扩展名的 C# 文件。编写 C# 代码。使用 csc 编译器编译代码。使用 mono …

    2026年10月3日 • 用户投稿
    100
  • MyBatis 批量插入的 3 种方式!还有谁不会?

    MyBatis 批量插入的 3 种方式!还有谁不会?MyBatis 批量插入的 3 种方式!还有谁不会?MyBatis 批量插入的 3 种方式!还有谁不会?MyBatis 批量插入的 3 种方式!还有谁不会?

    在springboot环境下,使用sql server数据库和jdk 1.8版本时,我们对比了三种批量插入数据的方式。以下是对这三种方法的详细分析和结论: 结论 对于少量数据的插入,建议使用反复执行单条插入语句的方式,因为这种方法简单易用。对于大量数据的插入,推荐使用批处理执行的方式。在我的测试环境…

    2026年10月3日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信