飞道的博客

来吧!一文彻底搞定数据结构之树!

354人阅读  评论(0)

庆哥: 小白啊,知道什么是树吗?😃

小白: 啥玩意?什么是树😕,我也是受过九年义务教育的啊,不知道什么是树那还得了,不就是杨条啊,春树啊😎

庆哥: 等等😅,杨条是什么鬼啊😹,我说的此树非彼树啊,我说的是数据结构中的概念😃

小白: 尴了个大尬😂,数据结构中的树啊,经常看但是说不上来😥,庆哥给我讲讲吧,最好大白话的去讲,我理解力差😅

庆哥: 可以可以,我最擅长大白话解释复杂概念了,走起,安排上😎

什么是树?数据结构中的

庆哥: 我们之前已经讲过数组,链表,栈和队列以及哈希表,链接在这里:

来吧!给你不一样的数组深入讲解!

轻轻松松学会栈和队列(附有顺序栈的实现思路分析)

链表不会?看这个立马就懂!

来吧!一文彻底搞定哈希表!

这都是很重要的数据结构哦,建议都读读哦,毕竟是我那么用心写的😄,今天咱就来说说数据结构中的这个树,其实吧,这里的树和真实我们见到的那些树木还是有关联的,不然为什么在数据结构中也叫树呢?

那你想想,在数据结构中为什么叫树呢?😏

小白: 像这样的情况,我觉得一般就是形似,也就是结构应该差不多,数据结构中的树这种结构应该和树的形状有关联😆

庆哥: 哈哈,聪明,数据结构中的树就是和现实中的树长得差不多,我们来看看现实中的树是不是都类似这个样子:

哈哈,我这里画的只是个模拟图,大致就这样,一棵树有树干,然后有各个树枝,然后还有各种叉子😂

小白: 嗯嗯,画的不赖😄,那数据机构中的树也是这样?

庆哥: 数据结构中的树是这样的:


这就是数据结构中用树这个结构去存储集合{A,B,C,D,E,F,G,H,I,J,K,L,M} 的示意图了,它和树有相似的地方,准确来说应该反着看和树的形状更像,你就记住,树结构和真实的树形状类似,现在你先不用管其他的,先来看这个图,你看看这其中的每个数据,也就是ABC那些有什么关系呢?

小白: 这样啊,每个数据之间都是连着的,这是不是说明每个数据之间都是有关系的,就比如数据A与B,C,D都有关系。

庆哥: 是的,我们在之前介绍的数组,链表,栈和队列等等都是线性存储结构,但是我们今天要介绍的这个树结构则不是线性结构了,对于线性结构,它们的数据基本上是hi一对一的关系,但是树结构从上面的图中也可以看得出来,它是一对多的关系,所以树结构是一种非线性数据结构,存储的数据是具有一对多的特点。

从图中我们看得出来比如A数据是和B,C,D都有关系的,再拿数据B来说,它是与E和F都有关系的,因此啊,我们把这种存储结构叫为“”树型“”存储结构

小白: 晓得了😎,就是这种结构跟树的结构差不多,树干上有树枝,每个树枝上可能还有其他小树枝,对吧😂

庆哥: 完全正确😄,接下来我们继续学习关于树的几个概念,对了,我们接下来说的树可都是指的树型结构,可不是你说的杨条哦😅

小白: 🤣

关于树的节点

那什么是节点呢?

庆哥: 关于这里,我发现有叫做节点,也有叫做结点的,反正都是一个意思啦,那什么是节点啊,其实也很简单,看图你就能猜得出来什么是节点?毕竟你是接受过九年义务教育的😄

小白: 我猜啊,这个节点应该指的就是树结构中的每一个数据啊,也就是下图的每一个圆圈😂

庆哥: 对的,就是这样的,比如图中的数据A或者B,它其实就是一个节点,那么怎么定义这个节点呢?

节点:使用树结构存储的每一个数据元素都被称为“节点”。比如 A 就是一个节点

根节点

那就这个节点来说,图中每个数据其实都是一个节点,但是根据每个节点所处的位置不同,它们还有各自独特的命名,什么嘞?你看啊,比如图中的A节点,你看看它是不是很特殊?

小白: 确实啊,最上面,老大节点😂

庆哥: 什么啊😅,准确来说,它是根节点,为啥叫根节点,你想,如果是一棵树的话,它是不是相当于在最下面,类似树根了,说一也叫作树根节点,简称根节点😁,然后你再看,它还有什么特点?

小白: 还有什么嘞?哦哦,它应该只有一个吧,也就是说只有一个根节点,一棵树不可能有两个树根吧😅

庆哥: 说的很对,对于树结构来说,它只有一个根节点,那怎么来给根节点下一个定义呢?那要来看另外一个节点叫做父节点

父节点,子节点和兄弟节点

庆哥: 那什么是父节点嘞?你说😎

小白: 父节点?这个有点懵啊😅

庆哥: 这个也好理解啊,父节点,就是父亲,儿子和兄弟这些概念😂,你看图中的B,它就是一个父节点,这个其实要找一个参照来说,不能孤立的来说哪个是父节点,对于B来说,E和F在它的下面,所以有这么一个关系就是B是E和F的父节点,而E和F是它们的子节点,这么一说好理解吧😀

在这里,这个父节点也可以叫做双亲节点,而子节点也可以叫做孩子节点,怎么样,这些概念名词都很形象化啊🤣

小白: 你这么一说倒是清楚的很😂

叶子节点

庆哥: 然后还有一个叶子节点的概念,这个更好理解,叶子节点,叶子,不就是树叶子吗😂,那你说哪些是叶子节点

小白: 这个啊,应该就是最边上的吧,也就是K,L,F这些😃

庆哥: 完全正确,说白了,叶子节点就是那些没有子节点的节点,那么我们再来看,怎么判断哪个是根节点呢?

小白: 这个,我看看,应该就是没有父节点的话就是根节点吧😏

庆哥: 很正确啊😁,根节点的判断依据就是如果一个结点没有父结点,那么这个结点就是整棵树的根结点。好了,我们继续说其他概念

子树和空树

庆哥: 这里的子树其实就可以根据子节点来说,比如上图,A是根节点,但是如果你单看节点 B、E、F、K、L 组成的部分来说,也是一棵树,而且节点 B 为这棵树的根结点。所以称 B、E、F、K、L 这几个结点组成的树为整棵树的子树;同样,结点 E、K、L 构成的也是一棵子树,根结点为 E。

肿么样,这也好理解吧😃

小白: 嗯嗯,不过这里我有个疑问啊,那这样的话,一个单个节点是不是也可以看做是一棵树呢?只不过是一颗光秃秃的树😅

庆哥: 这个问题提的可以啊,这里要注意,正如你想的那样,单个结点也是一棵树,只不过根节点就是它本身。图 中,节点 K、L、F 等都是树,且都是整棵树的子树。

那啥是空树知道不😏

小白: 这个啊,就是啥数据都没有吧,没有任何节点,一个空集合吧。

庆哥: 非常正确,这里再补充一点,你可以看图,有没有发现,具有同一个根节点的子树是互不联系的,也就是各个子树之间不能有交集,就比如图中,我们可以看到除了根节点 A,其余各个数据又各自构成了三个子树,根结点分别为 B、C、D,这三个子树相互之间没有相同的节点。如果有的话,那就破坏了树的结构,不能算做是一棵树。

小白: 嗯嗯,这点确实需要好好记一下!

节点的度和层次

庆哥: 我们接着来说树的另外两个概念,那就是度和层次,这又是啥嘞,我们在上面已经分析了什么是子树,那么度就好理解了:

度:对于一个节点而言,拥有的子树数称为节点的度(Degree)。比如,图中根节点 A 下分出了 3 个子树(BCD),所以,结点 A 的度为 3。

这也好理解吧,有个例子一看就明白了,这里说的是针对单个节点来说,那么对于一棵树而言,它的度是多少呢?

树的度:一棵树的度是树内各节点的度的最大值。图 中,各个节点的度的最大值为 3,所以,整棵树的度的值是 3。

咋样,理解不😅

小白: 嗯嗯,看着图很好理解这些概念😃

庆哥: 嗯嗯,那继续说层次,也就是节点的层次,这个更好理解,看图:


是不是很好理解,然后这里还有个概念,那就是树的深度也可以叫高度

树的高度(深度)

那什么是深度(高度)呢?

一棵树的深度(高度)是树中节点所在的最大的层次。上图树的深度为 4。

对了上面好像没有说什么是兄弟节点:

如果两个节点的父节点虽不相同,但是它们的父节点处在同一层次上,那么这两个节点互为堂兄弟,也即是兄弟节点,比如,节点 G 和 E、F、H、I、J 的父结点都在第二层,所以之间为堂兄弟的关系。

ok,这些概念也讲清楚了吧😏

小白: 没问题的😁

有序树和无序树

庆哥: 咱们这里再来谈两个概念,就是有序树和无序树,这又是什么呢?

你看啊,如果树中节点的子树从左到右看,谁在左边,谁在右边,是有规定的,那么这棵树称为有序树;反之就称为无序树,你看这也好理解吧

基于此,就有新的概念了,在有序树中,一个节点最左边的子树称为"第一个孩子",最右边的称为"最后一个孩子"。

举例来说,如果上图中的树其本身是一棵有序树,则以节点 B 为根节点的子树为整棵树的第一个孩子,以节点 D 为根节点的子树为整棵树的最后一个孩子。

ok,到这里就差不多了,下面咱们来总结一下

总结

到了这里知道了啥是树了吧,看图:


对于树这种存储结构啊,它从逻辑上来看,就类似我们生活中见到的树一样,只不过是倒过来的,而且我们在了解了关于树的一些概念之后,比如父子节点这些,是不是感觉更像我们熟知的家族图谱一样,每个节点之间有这样的父子,兄弟关系。

经过上面的讲解,对于树啊,你要知道各种节点是怎么一回事,然后还要会计算各个几点的度和层次,当然树的深度也必须要知道。

关于树啊,这才是刚刚开始,知识先了解基础概念,后面还有很多内容嘞,比如二叉树,红黑树,我猜你肯定听过,这些内容我们以后再详细探讨,今天就先到!再会!🥰

感谢阅读

大学的时候选择了自学Java,工作了发现吃了计算机基础不好的亏,学历不行这是没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习Java核心知识,深入的研习计算机基础知识,所有心得全部书写成文,整理成有目录的PDF,持续原创,PDF在公众号持续更新,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!

其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?

非常欢迎你的加入,未来的日子,编码之外,有你有我,一起做一个人不傻,钱很多,活得久的快乐的程序员吧!

回复关键字“PDF”,获取技术文章合集,已整理好,带有目录,欢迎一起交流技术!

另外回复“庆哥”,看庆哥给你准备的惊喜大礼包,只给首次关注的你哦!

任何问题,可以加庆哥微信:H653836923,另外,我有个交流群,我会***不定期在群里分享学习资源,不定时福利***,感兴趣的可以说下我邀请你!

对了,如果你是个Java小白的话,也可以加我微信,我相信你在学习的过程中一定遇到不少问题,或许我可以帮助你,毕竟我也是过来人了!

感谢各位大大的阅读🥰


转载:https://blog.csdn.net/sinat_33921105/article/details/103966050
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场