看图轻松理解数据结构与算法系列(Trie树)

前言

推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql

Trie树

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

Trie树特色

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

image

插入操做

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

image

接着从根节点开始,不存在h子节点,因而建立子节点h,网络

image

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

image

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

image

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

image

移到h子节点,数据结构和算法

image

继续处理第二个字符i,h节点不存在i子节点,因而建立i子节点,学习

image

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

image

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

image

移到h子节点,

image

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

image

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

image

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

image

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

image

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

image

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

image

查询操做

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

image

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

image

继续找i子节点,存在,但i并无单词标志,因此hi字符串不存在。

image

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

image

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

image

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

image

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

image

而若是查找hist字符串,则最后的t找不到,因此不存在该字符串。

删除操做

状况一

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

image

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

image

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

image

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

image

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

image

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

image

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

image

状况二

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

image

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

image

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

image

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

image

状况三

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

image

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

image

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

image

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

image

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

image

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

-------------推荐阅读------------

个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)

为何写《Tomcat内核设计剖析》

个人2017文章汇总——机器学习篇

个人2017文章汇总——Java及中间件

个人2017文章汇总——深度学习篇

个人2017文章汇总——JDK源码篇

个人2017文章汇总——天然语言处理篇

个人2017文章汇总——Java并发篇


跟我交流,向我提问:

欢迎关注:

相关文章
相关标签/搜索