字典树简单实现 插入 查找 遍历

字典树是一种存储字符串的高效的结构,它保存了不同字符的相同前缀,又因此叫做前缀树,使用前缀,大大避免相同字符的重复匹配,加快查找效率

  • 字典树是一颗多叉树,比如存储26个字母的,那么就有26叉
  • 字典树的节点不存储字符,而是用树的边来存储字符
  • 字典树的每一个节点都对应着一个字符子串
  • 字典树的叶子节点对应的字符串是创建字典树的字符串集合里的元素

如图:使用 5 个字符串创建字典树,蓝色节点代表子串,红色节点表示集合里的字符串(或者说字典树的叶子节点表示完整的字符串)

["apple", "apk", "kksk", "kkp", "boki"]

在这里插入图片描述

结构定义

可以快速的定义一个26叉树

/*
isEnd 表示是否是叶子节点
s 表示当前节点代表的字符串
*/
class node
{
   
public:
	bool isEnd;
	string s;
	node* childs[26];
	node(){
   s=""; isEnd=false; for(int i=0; i<26; i++)childs[i]=NULL;}	
};

插入元素

对于长度为n的字符串,我们依次遍历元素,从根节点开始,比如第一个字符是 ‘a’,那么查找根节点是否有 ‘a’ 的子树

  • 如果有,转到那个子树
  • 如果没有,创建新的子树,再转到

最后遍历结束时,记得把叶子节点的 isEnd 置一

void insert(node* &root, string s)
{
   
	node* p = root;
	for(int i=0; i<s.length(); i++)
	{
   
		if(p->childs[s[i]-'a']) p=p->childs[s[i]-'a'];
		else
		{
   
			node* nd = new node();
			nd->s = p->s + s[i];
			p->childs[s[i]-'a'] = nd;
			p = nd;
		}
	}
	p->
最低0.47元/天 解锁文章
数据结构之字典 详解
weixin_55786578的博客
05-05 1195
字典,又称Trie、单词查找、前缀,是一种形结 构,用于保存关联数组,其中的键通常是字符串。适合统计、 排序和存储大量的字符串,经常被搜索引擎系统用于文本词频 统计。字典利用字符串的公共前缀来减少查询时间,最大限度 地减少无谓的字符串比较,查询效率比哈希高。
字典-Trie
Dustin_CDS的博客
03-28 541
一、概念 字典,又称为单词查找,Tire数,是一种形结构,它是一种哈希的变种。利用字符串的公共前缀来减少查询时间,最大限度的减少无谓的字符串比较。 1.1 基本性质 根节点不包含字符,除根节点外的每一个子节点都包含一个字符 从根节点到某一节点。路径上经过的字符连接起来,就是该节点对应的字符串 每个节点的所有子节点包含的字符都不相同 1.2 特性 1)根节点不包...
算法数据结构——字典、前缀、单词查找(Trie)精讲及python实现
白话机器学习
06-05 1283
字典(Trie):又称为前缀、单词查找,是一种形结构。顾名思义,就是一个像字典一样的。它是字典的一种存储方式。字典中的每个单词在字典中表现为一条从根节点出发的路径,路径相连的边上的字母连起来就形成对应的字符串。例如下图就是一棵字典,其中包含有aabcacbaccachbchb这 7 个单词。从图中可以发现,这棵字典用边来表示字母,从根节点到上某一节点的路径就代表了一个单词。比如 1 → 2 → 6 → 10 表示的就是单词acc。
分门别类刷leetcode——高级数据结构(字典,前缀,trie,并查集,线段
一直走,不要回头
01-28 1172
Trie(字典、前缀)的基础知识 字典是一种有序的,用于统计、排序和存储字符串的数据结构,他与二叉查找不同,关键字不是直接保存在节点中,而是由节点在中的位置决定,每个节点代表了一个字符,从第一层孩子节点到中间的某个标记的节点代表了存储的字符串。 一个节点的所有子孙都有相同的前缀,而根节点对应空字符串。 一般情况下,不是所有的节点都有对应的字符串,只有叶子节点和部分内部节点进...
【数据结构】初入数据结构的字典 ( Trie Tree ) 及实现
长路漫漫的歇脚处
04-14 522
什么是字典字典的定义?字典的应用?怎么实现一颗字典
字典实现搜索
千丈之松的专栏
02-07 708
5| 安(1-false) 手(1-true) 杀(1-false) 成(1-false) 点(1-false) 云(1-true) 的(1-false) 杀(1-false) 不(10-false) 冷(1-false) 太(1-false)7| 的(1-false) 的(1-false) 尖(1-false) 不(1-false) 漠(1-true) 冷(9-false) 了(1-true)
python字典搜索,递归遍,打印所有存储的内容
leitingvre的博客
06-18 3196
如何遍python中的字典,补全单词 python中的字典结构非常好用,直接利用键赋值就可以创建出形结构的分支, 创建一个字典 dict = {"a": "$", "b": { "c": {"g": "$", "h": "$"}, "e": {"i": "$", "j": "$"}, "f":
深度优先遍字典(统计单词出现的个数)
04-14
NULL 博文链接:https://128kj.iteye.com/blog/1734260
二叉的遍操作、 二叉查找 、 Trie 字典
57
06-30 463
目录 二叉 的遍操作 二叉查找 Trie 字典) 总结 二叉 在二叉中,有下面两个特殊的类型,如下图所示: 满二叉,定义为除了叶子结点外,所有结点都有 2 个子结点。 完全二叉,定义为除了最后一层以外,其他层的结点个数都达到最大,并且最后一层的叶子结点都靠左排列。 存储二叉有两种办法,一种是基于指针的链式存储法,另一种是基于数组的顺序存储法。 链式存储法,也就是像链表一样,每个结点有三个字段,一个存储数据,另外两个分别存放指向左右子结点的指
蓝桥杯(Python)相关知识点记录,包含基础知识点,数据结构等算法实现,真题练习
最新发布
03-24
蓝桥杯Python相关的知识点记录包括基础知识点、数据结构等算法实现以及真题练习项目说明。...与图:如二叉、哈夫曼等的基本结构和遍方法。 排序与查找:如冒泡排序、快速排序、二分查找等算法的实现和应用。
quicknode:一个小型库,可使用BST(二进制搜索)以C语言使用词典
05-04
快速节点 一个小型库,可使用BST(二进制... 此外,您还可以使用其他操作,例如遍查找节点的前任或后继。 编译 cd quicknode make 或者 gcc -o quicknode * .c 运行: ./quicknode 执照 GNU通用公共许可证v3.0
米哈游部分笔试题目-C语言方向.docx
03-10
哈希表数据结构:哈希表是一种以键值对形式存储数据的数据结构,通过哈希函数将键映射到数组的特定位置...字典(Trie)数据结构:字典是一种多叉结构,用于高效地存储和查找字符串集合,尤其适用于前缀匹配问题。
戳气球leetcode-Leetcode_notes:C++中的leetcode解决方案
06-30
字典里反序插入单词 路径 返回所有sum==target路径 是否存在一条sum==target路径 dfs二叉。path在局部(不需pop)、在全局(需要pop,但是,有2个测试用例,你不知道pop多少) [129.所有路径:根到叶子节点...
数据结构课设
01-03
任务:建立一个微型电子字典实现生词的加入,单词的查找、删除,修改等操作。 数据结构:键 9、稀疏矩阵相乘 任务:以三元组形式存储稀疏矩阵,实现矩阵相乘 10、平衡二叉 任务:平衡二叉的建立、结点的...
字典的遍、二叉查找
solumin的博客
07-27 693
字典 前缀 """ 一、题目 实现一个字典or前缀,包含insert、search和startswith功能 """ class Node(): def __init__(self): self.childs = [None] * 26 self.isLeaf = False class Trie(object): def _...
c语言 trie,C语言实现Trie字典)的插入查找删除与遍操作
weixin_31741271的博客
05-19 1312
Trie,也称作是字典,是一种哈希的变种,查询效率较高。Trie可以用于统计或者排序大量的字符串,比如对一系列字符串按照字典序排序。字典是一个多叉,每一个节点上存储的不是一个字符串,而是一个字符,从根节点到某个节点的路径上的所有字符串联起来就构成了一个字符串。对于N个字符串,如果其平均长度为M,则建立字典的算法复杂度为O(M*N),在字典查找某个长度为M的字符串的算法复杂度O(M...
字典原理与实现
geek!
09-19 371
字典(*trie*),又称前缀,或单词查找,是一棵专用于查找单词或单词前缀是否存在的
字典 (Trie) | 插入和搜索
嗅探网的博客
09-17 398
如果插入的单词是新的或者是现有词的扩展,我们需要构造新的节点。如果新插入的词是Trie中现有词的前缀,我们只需将这个词的最后一个字母标记为该词的结尾。如果我们将Key存储在二叉搜索中,平衡良好的 BST 的各种操作的时间复杂度与。成正比,其中 M 是最大字符串长度,N 是中Key的数量。使用 Trie,我们可以在 O(M) 时间内搜索到Key,但是,Trie 的缺点是对存储要求很高即空间复杂度较高。我们需要将每个键的最后一个节点标记为词节点的结尾。单词的每个字母都作为一个单独的 Trie 节点插入
Python 字典
weixin_42253753的博客
08-18 490
Python 字典
Trie字典的Java代码实现 返回单词
08-07
### 回答1: Trie字典的Java代码实现可以分为以下几部分: 1. 定义Trie节点类,包含children数组和isEndOfWord标识,用于表示是否是单词的结尾。 2. 定义Trie类,包含插入查找和删除操作。 3. 在Trie类中实现插入操作,遍字符串每一个字符,在Trie中寻找对应节点,如果不存在则新建节点。 4. 在Trie类中实现查找操作,遍字符串每一个字符,在Trie中寻找对应节点,如果找到最后一个字符对应的节点的isEndOfWord标识为true,则说明字符串是单词。 5. 在Trie类中实现删除操作,遍字符串每一个字符,在Trie中寻找对应节点,如果找到最后一个字符对应的节点的isEndOfWord标识为true,则将其设为false,并删除空节点。 如果需要完整代码和注释请告诉我。 ### 回答2: Trie(字典)是一种常用的数据结构,用于高效地存储和查找字符串。下面是Trie字典的Java代码实现,用于返回单词。 ```java class TrieNode { private TrieNode[] children; private boolean isEndOfWord; public TrieNode() { children = new TrieNode[26]; // 字母表的大小为26 isEndOfWord = false; } public void insert(String word) { TrieNode curr = this; for (char c : word.toCharArray()) { if (curr.children[c - 'a'] == null) { curr.children[c - 'a'] = new TrieNode(); } curr = curr.children[c - 'a']; } curr.isEndOfWord = true; } public boolean search(String word) { TrieNode node = searchPrefix(word); return node != null && node.isEndOfWord; } public boolean startsWith(String prefix) { TrieNode node = searchPrefix(prefix); return node != null; } private TrieNode searchPrefix(String prefix) { TrieNode curr = this; for (char c : prefix.toCharArray()) { if (curr.children[c - 'a'] == null) { return null; } curr = curr.children[c - 'a']; } return curr; } } public class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } public void insert(String word) { root.insert(word); } public boolean search(String word) { return root.search(word); } public boolean startsWith(String prefix) { return root.startsWith(prefix); } } public class Main { public static void main(String[] args) { Trie trie = new Trie(); trie.insert("apple"); trie.insert("app"); System.out.println(trie.search("apple")); // 输出:true System.out.println(trie.startsWith("app")); // 输出:true System.out.println(trie.search("banana")); // 输出:false } } ``` 以上代码中,`TrieNode`表示Trie的节点,`Trie`表示Trie的结构。其中`TrieNode`类包含了插入单词、查找单词(完全匹配)以及查找前缀的功能。`Trie`类则是对外提供插入查找单词和前缀的方法。 在`main`方法中,我们演示了如何使用`Trie`类来插入查找单词。首先,我们插入了两个单词"apple"和"app"。然后分别调用`search`方法来查找"apple"和"banana",以及`startsWith`方法来查找以"app"开头的单词。最后,打印出对应的结果,即是否找到了对应的单词或前缀。 以上是Trie字典的Java代码实现,用于返回单词。 ### 回答3: Trie字典是一种经典的数据结构,用于高效地存储和查找字符串集合。下面是一个基于Java的Trie字典的代码实现,可以实现返回单词的功能: ```java class TrieNode { private final int ALPHABET_SIZE = 26; private TrieNode[] children; private boolean isEndOfWord; public TrieNode() { children = new TrieNode[ALPHABET_SIZE]; isEndOfWord = false; } } class Trie { private TrieNode root; public Trie() { root = new TrieNode(); } public void insert(String word) { TrieNode current = root; for (int i = 0; i < word.length(); i++) { char ch = word.charAt(i); int index = ch - 'a'; if (current.children[index] == null) { current.children[index] = new TrieNode(); } current = current.children[index]; } current.isEndOfWord = true; } public boolean search(String word) { TrieNode current = root; for (int i = 0; i < word.length(); i++) { char ch = word.charAt(i); int index = ch - 'a'; if (current.children[index] == null) { return false; } current = current.children[index]; } return current != null && current.isEndOfWord; } public List<String> getAllWords() { List<String> result = new ArrayList<>(); TrieNode current = root; StringBuilder sb = new StringBuilder(); getAllWordsUtil(current, sb, result); return result; } private void getAllWordsUtil(TrieNode node, StringBuilder sb, List<String> result) { if (node == null) { return; } if (node.isEndOfWord) { result.add(sb.toString()); } for (int i = 0; i < ALPHABET_SIZE; i++) { if (node.children[i] != null) { sb.append((char)('a' + i)); getAllWordsUtil(node.children[i], sb, result); sb.deleteCharAt(sb.length() - 1); } } } } public class Main { public static void main(String[] args) { Trie trie = new Trie(); String[] words = {"hello", "world", "java", "programming"}; for (String word : words) { trie.insert(word); } List<String> allWords = trie.getAllWords(); System.out.println("All words in trie: " + allWords); } } ``` 上述代码中,TrieNode类表示字典的节点,包括一个指向子节点的数组和一个标记,用于表示节点是否是某个单词的结尾。Trie类封装了字典的操作,包括插入单词、查找单词和返回所有单词的功能。在代码的主函数中,我们创建一个Trie对象并插入一些单词,然后调用getAllWords()方法返回字典中的所有单词。最后,打印出返回的单词列表。 希望以上解答对您有所帮助,如有更多疑问,请继续追问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Linux Shell 脚本简单地读取,写入文件 32777
  • 浅谈《原神》中的图形渲染技术 24243
  • 解决百度文库复制问题 非VIP也能复制文字 23248
  • LC-3指令集 指令/状态码介绍 21805
  • 最简单的网页登录注册功能讲解及其实现 19940

分类专栏

  • 图形学 7篇
  • 计算机系统 34篇
  • 杂记 19篇
  • 计网 1篇
  • 操作系统 9篇
  • 算法实验 7篇
  • LeetCode 116篇
  • 数据库 10篇
  • OpenGL学习 14篇
  • Z小刀公众号转载 1篇
  • 数学 23篇
  • 算法 89篇
  • 前后端 27篇
  • nodejs 7篇
  • mc光影 10篇
  • c++期末复习 4篇
  • python 5篇
  • 爬虫 3篇
  • Java 19篇
  • C++与其STL 23篇
  • 数据结构 43篇
  • 蓝桥杯 74篇
  • 机器学习 4篇
  • Linux 9篇

最新评论

  • 分治法求最近点对 (深大算法实验2)报告+代码

    小白不会计算机~~~: 师兄,问一下分治+归并求解的时候采用归并排序不会把原来从左到右排列的点打乱吗,这样做感觉有影响欸

  • 编写.bat脚本阻止EasyConnect在桌面创建快捷方式

    tttDK_T: 害~强迫症晚期了

  • proteus 8 仿真时 时间流动过慢的解决方案

    dbxzjq: 下载个17版的吧!把时钟设置为72M,时钟缩放设置为8,就与软件运行的时间同步了

  • 计组复习(一):乘法器,除法器与浮点加法器

    sunsir咩咩: 左移右移写反了,乘法辣里

  • 计组复习(三):流水化的数据通路,流水线冒险检测与处理

    Lucas983: 能不能单独买你这一篇文章啊😭

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 光线追踪渲染实战(五):低差异序列与重要性采样,加速收敛!
  • 光线追踪渲染实战(四):微平面理论与迪士尼 BRDF,严格遵循物理!
  • 光线追踪渲染实战(三):OpenGL 光线追踪,用 GPU 加速计算!
2021年30篇
2020年404篇
2019年4篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源斗罗大陆奥斯卡泽天记尸妖免费起名网站大全集睿字起什么名字好假日暖洋洋剧情介绍恢复删除照片魔法世纪黑色禁药爱妻日记文不加点的意思史各庄崔字男宝起名三峡大坝有三孔泄洪名典在线起名免费取名被恶魔一见钟情的种种下场曹郁湖南05后女生696分考入北大一笑渡凡间古筝培训班起名字免费宝宝起名测分数巴哥犬起个名字大全墙布品牌起名公司起名名字测吉凶母爱作文hogtied保护地球宁起姓名刊物起名给孩子应该怎样起名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化