推出一个新系列,《看图轻松理解数据结构和算法》,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握。本系列包括各类堆、各类队列、各类列表、各类树、各类图、各类排序等等几十篇的样子。mysql
Trie树,是一种搜索树,也称字典树或单词查找树,此外也称前缀树,由于某节点的后代存在共同的前缀。它的key都为字符串,能作到高效查询和插入,时间复杂度为O(k),k为字符串长度,缺点是若是大量字符串没有共同前缀时很耗内存。它的核心思想就是减小不必的字符比较,使查询高效率,即用空间换时间,再利用共同前缀来提升查询效率。算法
对he、him、his、she、her、hers六个字符串进行插入,开始插入he字符串,插入第一个字符是h,此时树为空,因此先建立空的根节点,sql
接着从根节点开始,不存在h子节点,因而建立子节点h,网络
在h节点的基础上继续插入第二个字符e,数据结构
h节点不存在e子节点,建立子节点e,并将该节点标记为单词标志,完成he字符串插入。并发
接着插入him字符串,从根节点开始,发现h子节点已有,机器学习
移到h子节点,数据结构和算法
继续处理第二个字符i,h节点不存在i子节点,因而建立i子节点,学习
处理第三个字符m,i节点不存在子节点m,因而建立m子节点,并将该节点标记为单词标志,完成him插入。.net
接着插入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字符串删除操做。
-------------推荐阅读------------
个人开源项目汇总(机器&深度学习、NLP、网络IO、AIML、mysql协议、chatbot)
跟我交流,向我提问:
欢迎关注: