Trie树

Trie树,是一种搜索树,也称字典树或单词查找树,此外也称前缀树,因为某节点的后代存在共同的前缀。它的key都为字符串,能做到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是如果大量字符串没有共同前缀时很耗内存。它的核心思想就是减少没必要的字符比较,使查询高效率,即用空间换时间,再利用共同前缀来提高查询效率。

Trie树特点

  • 根节点不包含字符,其他节点每个节点只包含一个字符。
  • 从根节点到某一节点经过路径的字符连起来即为该节点对应的字符串。
  • 每个节点的所有子节点字符都不相同。

插入操作

对he、him、his、she、her、hers六个字符串进行插入,开始插入he字符串,插入第一个字符是h,此时树为空,所以先创建空的根节点,

接着从根节点开始,不存在h子节点,于是创建子节点h,

在h节点的基础上继续插入第二个字符e,

h节点不存在e子节点,创建子节点e,并将该节点标记为单词标志,完成he字符串插入。

接着插入him字符串,从根节点开始,发现h子节点已有,

移到h子节点,

继续处理第二个字符i,h节点不存在i子节点,于是创建i子节点,

处理第三个字符m,i节点不存在子节点m,于是创建m子节点,并将该节点标记为单词标志,完成him插入。

接着插入his字符串,从根节点开始,发现h子节点已有,

移到h子节点,

继续处理第二个字符i,h节点已存在i子节点,于是移到i节点,

处理第三个字符s,i节点不存在子节点s,于是创建s子节点,并将该节点标记为单词标志,完成his插入。

继续插入she字符串,从根节点开始,首先处理第一个字符s,发现s子节点不存在,于是创建s节点,

接着处理第二个字符h,s节点不存在h子节点,创建h节点,

继续处理第三个字符e,h节点不存在e子节点,创建e节点,并将该节点标记为单词标志,至此完成she字符串插入。

类似地,将her、hers字符串插入到树中,最终为:

查询操作

查找hi字符串,从根节点开始,

根节点存在h子节点,移动到h节点,

继续找i子节点,存在,但i并没有单词标志,所以hi字符串不存在。

查找his字符串,从根节点开始,

根节点存在h子节点,移动到h节点,

h节点存在i子节点,移动到i节点,

继续找s子节点,存在,而且s节点为单词标志,找到his字符串。

而如果查找hist字符串,则最后的t找不到,所以不存在该字符串。

删除操作

情况一

删除she字符串,从根节点开始查找第一个字符s,

找到s子节点,下移到s节点,继续查找字符h,

找到h子节点,下移到h节点,继续查找字符e,

找到e节点,已经找到she字符串,将e节点的单词标志去掉,

此时发现e节点为叶子节点,将其删除,

删除后发现h节点为叶子节点,且其不是单词标志,将其删除,

删除后发现s节点为叶子节点,且其不是单词标志,将其删除,完成she字符串删除操作。

情况二

删除her字符串,从根节点开始查找第一个字符h,

找到h子节点,下移到h节点,继续查找字符e,

找到e子节点,下移到e节点,继续查找字符r,

找到r子节点,此时完成整个字符串查找,因为不是叶子节点,只需将其单词标志去掉即可。

情况三

删除his,从根节点开始查找第一个字符h,

找到h子节点,下移到h节点,继续查找字符i,

找到i子节点,下移到i节点,继续查找字符s,

找到s子节点,此时完成整个字符串查找,

删除后发现s节点为叶子节点,将其删除,

删除后发现i节点为非叶子节点,停止删除,完成his字符串删除操作。

作者:超人汪小建
链接:https://juejin.im/post/5ba198ba5188255c7c6555c9
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

13-看图理解数据结构与算法系列(Trie树)的更多相关文章

  1. 19-看图理解数据结构与算法系列(Radix树)

    Radix树 Radix树,即基数树,也称压缩前缀树,是一种提供key-value存储查找的数据结构.与Trie不同的是,它对Trie树进行了空间优化,只有一个子节点的中间节点将被压缩.同样的,Rad ...

  2. 09-看图理解数据结构与算法系列(B树)

    B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...

  3. 06-看图理解数据结构与算法系列(AVL树)

    AVL树 AVL树,也称平衡二叉搜索树,AVL是其发明者姓名简写.AVL树属于树的一种,而且它也是一棵二叉搜索树,不同的是他通过一定机制能保证二叉搜索树的平衡,平衡的二叉搜索树的查询效率更高. AVL ...

  4. 11-看图理解数据结构与算法系列(B树的删除)

    删除操作 删除操作比较复杂,主要是因为删除的项可能在叶子节点上也可能在非叶子节点上,而且删除后可能导致不符合B树的规定,这里暂且称之为导致B树不平衡,于是要进行一些合并.左旋.右旋等操作,使之符合B树 ...

  5. 10-看图理解数据结构与算法系列(B+树)

    B+树 B+树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点.内部节点和叶子节点.多用于数据库和操作系统的文件系统中,由于B+树内部节点不保存数据,所以能在内存中存放更多索引, ...

  6. 17-看图理解数据结构与算法系列(NoSQL存储-LSM树)

    关于LSM树 LSM树,即日志结构合并树(Log-Structured Merge-Tree).其实它并不属于一个具体的数据结构,它更多是一种数据结构的设计思想.大多NoSQL数据库核心思想都是基于L ...

  7. 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文

    <看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...

  8. 数据结构与算法简记--Trie树

    Trie树 概念 多叉树,节点为字符串中的单个字符. Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起. 将多个字符串按字符拆分插入Trie树,用于字符串查找,关键词提示等 举 ...

  9. 数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解

    数据结构与算法系列2 线性表 使用java实现动态数组+ArrayList源码详解 对数组有不了解的可以先看看我的另一篇文章,那篇文章对数组有很多详细的解析,而本篇文章则着重讲动态数组,另一篇文章链接 ...

随机推荐

  1. urllib的高级用法

    Handler简介 我们可以把他理解为各种处理器,有专门处理登录验证的,有处理cookies的,有处理代理设置的.利用他们,我们几乎可以做到HTTP请求中的所有事情. 首先,介绍一下 urllib.r ...

  2. AJPFX总结final、finally、finallize的区别

    final.finally.finallize有何区别?    final表示一个修饰符,如果用它来修饰一个类,则该类是不能继承的:如果用它来修饰一个变量,则该变量一旦赋值之后就不能再修改:如果用它来 ...

  3. HTML5应用缓存与Web Workers

    1.什么是应用程序缓存      HTML5引入了应用程序缓存,这意味着web应用可进行缓存,并可在没有因特网链接时进行访问. 2.应用缓存的优势      离线浏览   用户可在应用离线时使用它们 ...

  4. Linux 之 2>&1

    我们在Linux下经常会碰到nohup command>/dev/null 2>&1 &这样形式的命令.首先我们把这条命令大概分解下首先就是一个nohup表示当前用户和系统 ...

  5. swiper4实现的拥有header和footer的全屏滚动demo/swiper fullpage footer

    用swiper4实现的拥有header和footer的全屏滚动demo, <!DOCTYPE html> <html lang="en"> <head ...

  6. Python3 动手自己写谷歌翻译

    本篇为实现谷歌翻译的功能,在编写的时候以为只是一个接口的问题. 没想到的是每次翻译都会触发一次JS的执行,在请求参数中生成一个tk. 文中tk的实现是复用的网上大神的代码生成tk. 好了,不说了直接看 ...

  7. API设计指南(译)

    API的设计在软件系统中的重要性不言而喻,在swift.org上看到一篇“API Design Guidelines”,虽然是就Swift而言,但对于其它语言也有不少可以借鉴的地方,在这里粗略翻译一二 ...

  8. 关于Qt模态框总汇

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7285710.html 父窗体为QMainWindow: 当子窗体为: 1.QWidget,需要设置 this- ...

  9. ES6扩展运算符的使用

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. python3安装opencv及电子书籍(百度云)

    不能直接  pip install opencv 正解: pip install opencv-python  记得:请确保网络良好!!!!! (1)这个是我学习的电子书籍:opencv-python ...