【hot100】实现Trie(前缀树)

embedded/2025/3/15 2:18:12/

一、思路

这题的思路很简单,其实就是一个26叉树,但是这个数不同通过通常的左右节点属性,而是一个数组来存储的,每个数组下标存储下层的数组。其中有以下需要注意的点:

1.private Trie[] children;

        这个说明孩子节点是一个Trie类型的数组,即数组中每个下标存储的就是一个Trie结构类型,每个下标包含两个属性,即可以通过Trie.children[index]访问到子节点,Trie.children[index].isEnd访问到子节点的isEnd属性。

2.递归数据结构VS递归函数

以下是递归数据结构的核心代码,可以明显的看出和普通函数调用式递归的区别

还有就是其中通过'this'来获取根类

public void insert(String word){Trie node = this;//获取当前类,赋值给nodefor (int i =0;i<word.length();i++){char letter = word.charAt(i);int num = letter - 'a';//获取当前字符相对于a的位置//注意下面代码都是对当前层的node进行操作,不要直接引用类属性,不然就是在反复修改根节点了if (node.children[num]==null){//当前字母对应的数组为空node.children[num]=new Trie();//使用上面构造的初始化函数,向下赋值;}node = node.children[num];}node.isEnd = true;}
1. 递归结构本质
  • 数据结构的递归性
    Trie 树的每个节点(Trie 对象)包含一个子节点数组 children,每个子节点又是一个 Trie 实例。这种结构天然形成一棵多叉树,通过 对象间的引用关系 隐式构建递归层级。

  • 操作逻辑的非递归性
    代码中通过 循环迭代(如 for 循环)遍历树的层级,而非显式调用自身方法。例如,insert 方法通过移动 node 指针(node = node.children[num])逐层向下插入节点。

  • 迭代代替递归
    通过 node 指针的更新模拟递归的层级深入,但未发生函数调用栈的变化。

2. 优点
  • 内存高效:避免函数递归调用的栈开销,适合处理深度较大的数据结构。

  • 性能稳定:无栈溢出风险,适合处理长字符串或大规模数据。

  • 逻辑直观:通过对象引用直接操作树形结构,代码可读性高

特性递归数据结构递归函数
核心体现数据结构中包含对自身类型的引用函数调用自身
操作方式通常使用迭代(如循环)操作对象引用显式调用自身,通过调用栈保存状态
内存消耗低(无栈帧累积)高(每层递归产生栈帧,可能栈溢出)
适用场景树形结构(如 Trie、二叉树)、链表等分治、回溯、树/图遍历等
代码示例Trie[] children(Trie 树)void preOrder(TreeNode node)(二叉树遍历)

二、记忆

1.多叉树用数组表示

2.递归数据结构的使用

3.字符相减获取相对位置

int num = letter - 'a';//获取当前字符相对于a的位置

三、代码

public class Trie{private Trie[] children;private boolean isEnd;public Trie(){children = new Trie[26];isEnd = false;}public void insert(String word){Trie node = this;//获取当前类,赋值给nodefor (int i =0;i<word.length();i++){char letter = word.charAt(i);int num = letter - 'a';//获取当前字符相对于a的位置//注意下面代码都是对当前层的node进行操作,不要直接引用类属性,不然就是在反复修改根节点了if (node.children[num]==null){//当前字母对应的数组为空node.children[num]=new Trie();//使用上面构造的初始化函数,向下赋值;}node = node.children[num];}node.isEnd = true;}public boolean search(String word){Trie trie = searchPrefix(word);return trie!=null && trie.isEnd;//和搜索前缀唯一的不同就是要求当前节点是结束节点}public boolean startsWith(String prefix){return searchPrefix(prefix)!=null;}private Trie searchPrefix(String word){Trie node = this;for (int i =0;i<word.length();i++){char letter = word.charAt(i);int num = letter - 'a';//获取当前字符相对于a的位置if (node.children[num]==null){//当前字母对应的数组为空return null;}node = node.children[num];}return node;}}


http://www.ppmy.cn/embedded/172639.html

相关文章

软考高级《系统架构设计师》知识点(十三)

系统架构设计 软件架构的概念 一个程序和计算系统软件体系结构是指系统的一个或者多个结构。结构中包括软件的构件&#xff0c;构件的外部可见属性以及它们之间的相互关系。 体系结构并非可运行软件。确切地说&#xff0c;它是一种表达&#xff0c;使软件工程师能够&#xff1a…

《今日AI-人工智能-编程日报》

1. AI行业动态 1.1 Manus通用智能体初成型&#xff0c;开启AIAgent新时代 中泰证券发布研报称&#xff0c;首款通用型AI智能体Manus已问世&#xff0c;能够将复杂任务拆解为可执行的步骤链&#xff0c;并在虚拟环境中灵活调用工具&#xff0c;标志着AI从“Reasoner”走向“Ag…

laravel项目中使用FFMPeg 剪裁视频

# 运行环境需安装的软件 ffmpeg # 安装的扩展 pbmedia/laravel-ffmpeg: ^8.3 # 扩展文档 https://packagist.org/packages/pbmedia/laravel-ffmpeg # 引入的类 use FFMpeg\Coordinate\TimeCode; use FFMpeg\Format\Video\X264; use FFMpeg\Exception\RuntimeException; use …

Machine Learning中的模型选择

选择适合的机器学习模型是构建高效、准确模型的关键步骤。以下是决定选用哪个模型的主要考虑因素和步骤&#xff1a; 1. 明确问题类型 首先&#xff0c;明确你要解决的问题类型&#xff1a; 分类问题&#xff1a;预测离散类别&#xff08;如垃圾邮件分类、图像识别&#xff09…

《C#上位机开发从门外到门内》2-3:SPI总线协议详解及应用实践

文章目录 一、引言二、SPI总线协议的基本原理三、SPI通信模式详解 —— CPOL与CPHA3.1 时钟极性&#xff08;CPOL&#xff09;3.2 时钟相位&#xff08;CPHA&#xff09;3.3 四种SPI模式 四、主从设备通信机制4.1 通信流程概述4.2 数据帧结构与传输细节4.3 主设备与从设备的协同…

用PHP的Guzzle库编写的图片爬虫程序

使用 PHP 的 Guzzle 库编写一个图片爬虫程序是一个非常常见的任务&#xff0c;Guzzle 是一个流行的 HTTP 请求库&#xff0c;允许你轻松地发送请求和处理响应。 下面是一个使用 Guzzle 编写的图片爬虫程序示例。此程序将从指定的网页中提取图片链接并将图片下载到本地。 1、安…

无法解析插件 org.springframework.boot:spring-boot-maven-plugin:2.4.13报错异常

今天导入项目的时候&#xff0c;Maven突然加载异常爆红 重新配置了一下用户文件查看包里是否有我们需要的版本&#xff08;这个版本必须与父文件版本相同&#xff09;&#xff0c; 找到你自己的maven文件地址 路径&#xff1a;Maven\repository\org\springframework\boot\spri…

TCP网络协议

TCP粘包 1. TCP在接收数据时&#xff0c;多包数据粘在了一起 2. 原因&#xff1a; 1. TCP发送数据时&#xff0c;没有及时发走&#xff0c;会根据缓冲区数据的情况进行重新组包&#xff1b; 2. TCP接收方&#xff0c;没有及时读走缓冲区数据&#xff0c;导致缓冲区大量数…