13

轻松搞懂Trie树

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MjM5MzA1Mzc3Nw%3D%3D&%3Bmid=2247485475&%3Bidx=1&%3Bsn=7105653238f5ee8717914cbe6dd13a98
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Trie树

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

73EJvmQ.jpg!mobile Trie树

Trie树特点

  • 根节点不包含字符,其他节点每个节点只包含一个字符。

  • 从根节点到某一节点经过路径的字符连起来即为该节点对应的字符串。

  • 每个节点的所有子节点字符都不相同。

iQ3eyum.jpg!mobile

插入操作

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

AJVbayy.jpg!mobile

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

EvuYfi2.jpg!mobile

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

BRF7RzV.jpg!mobile

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

RJ7fYfv.jpg!mobile

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

B77j2e6.jpg!mobile

移到h子节点。

vumyqyi.jpg!mobile

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

2Eve6nu.jpg!mobile

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

AvEB3yU.jpg!mobile

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

Mvimaen.jpg!mobile

移到h子节点。

NjIvMbf.jpg!mobile

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

U77bQjm.jpg!mobile

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

MziIbuJ.jpg!mobile

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

Q3mQNfq.jpg!mobile

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

3EF3uuU.jpg!mobile

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

reEzQfB.jpg!mobile

类似地,将her、hers字符串插入到树中,最终如下。

qYZFjqB.jpg!mobile

查询操作

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

I7jMjuy.jpg!mobile

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

byEFn2a.jpg!mobile

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

y6nUzeN.jpg!mobile

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

I7jMjuy.jpg!mobile

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

byEFn2a.jpg!mobile

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

y6nUzeN.jpg!mobile

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

EFNFn2.jpg!mobile

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

删除操作

情况一

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

veqMRr7.jpg!mobile

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

ABbyMjj.jpg!mobile

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

uqMjyau.jpg!mobile

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

fMfQBvv.jpg!mobile

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

eq22A3I.jpg!mobile

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

eAfEJ32.jpg!mobile

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

mEbiiqi.jpg!mobile

情况二

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

77vMZjz.jpg!mobile

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

IzyIfey.jpg!mobile

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

ZFbEryu.jpg!mobile

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

y6BJzeY.jpg!mobile

情况三

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

77vMZjz.jpg!mobile

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

IzyIfey.jpg!mobile

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

3m2ERzA.jpg!mobile

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

EBVfiqy.jpg!mobile

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

mUbm6fR.jpg!mobile

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

如果您喜欢这种讲解方式,那么推荐一本数据结构算法书:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK