Android技能树 — 树基础知识小结(一)

Android基础知识

Android技能树 — 动画小结

Android技能树 — View小结

Android技能树 — Activity小结

Android技能树 — View事件体系小结

Android技能树 — Android存储路径及IO操作小结

Android技能树 — 多进程相关小结

Android技能树 — Drawable小结

数据结构基础知识

Android技能树 — 数组,链表,散列表基础小结

Android技能树 — 树基础知识小结(一)

算法基础知识

Android技能树 — 排序算法基础小结

本文主要讲关于树的基础知识。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一棵非空树中:(1)有且仅有一个特定的称为根(Root)的结点;(2)当n>1时,其余结点可分为m(m>O)个互不相交的有限集T1、T2、……、 Tm,其中每一个集合本身又是一棵树,并且称为根的子树(SubTree)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基础知识

结点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据上面的基础知识我画了一个归总的图(这样我就不需要写文字介绍了,啊哈哈):

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

树结构特点

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还是用自己画的图来说明:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

存储结构

Android技能树 — 数组,链表,散列表基础小结中,我们介绍了线性存储,链式存储,我们的树可以充分用二者来结合表示。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们统一来用上面各种方式来表示下面这个树的存储结构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

双亲表示法:

在每个结点中,附设一个指示器指示其双亲结点在数组中的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为有十一个结点,所以我们的index为0-10,然后index位置中存储(data + parent的index值),结果如下图所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这里我们发现根据index里面的parent指针,很容易知道父结点,但是比如我问知道了E结点,想知道它的子结点是哪几个,就不知道了,只能通过整个结构的遍历。

当然我们可以变相的 多加一个指针:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们又比较关注兄弟结点之间的关系,可以增加一个右兄弟域来体现兄弟关系:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

孩子链表表示法:

把每个结点的孩子结点排列起来,以单链表作存储结构,则n 个结点有n个孩子链表,如果是叶子结点,则此单链表为空。然后n个头指针又组成一个线性表,采用顺序存储结构,存放进一个一维数组中。

用孩子表示法表示我们上面的树,结构如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以我们的结点结构有二种: 1.表头数组的表头结点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 孩子链表的孩子结点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这样子对于查找某个结点的孩子,或者找某个结点的兄弟都方便,但似乎如果要找某个结点的双亲结点就麻烦了。所以我们可以结合上面讲过的《双亲表示法》

双亲孩子表示法:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

把上面二个方法结合就可以了。

孩子兄弟表示法:

任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。 所以设置二个指针,分别指向该结点的第一个孩子和此结点的右兄弟

所以和上面类似,只是我们存了不同的二个指针(从方法名字就知道,<孩子><兄弟>法,一个孩子,一个兄弟,二个指针)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们把上面的树按照这种方式实现:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

森林:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

继续画个图来说明,省得打字了,嘿嘿:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

分类

树也是会根据不同条件,做了分类,我们来了解一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那有序树和无序数的区别在于哪里呢?

如果将树中结点的各子树看成从左至右是有次序的,不能互换,则成为有序树,否则就是无序树

比如我们只是单纯的表示一个家族的关系:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比如只是说明A的孩子有B跟C,这时候B和C换了位置叶 没关系,这时候就是无序树。

但是如果我们这个家族谱是按照年龄来排序(长子,次子),那这时候B和C就不能换位置了,这时候就是有序树。

但是我们平常说的树通常都是指的有序树,而有序树有很多分类,比较多的就是二叉树。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二叉树:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

基本形态:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二叉树性质:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实这个类似与我们以前数学课上要背的数学公式,大家可以自己画个二叉树,然后试着上面的公式比对下,是不是正确。

遍历二叉树:

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问依次且仅被访问一次。

前序遍历:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

单单看这个图,其实换成我,我也看不懂规律,但是我们只需要懂得其中的规则就行。

伪代码:

遍历(结点对象 t){
if( t == null){
return;
}
//第一步,实现某个业务操作,比如我们是打印结点字符串。
print(t)
//第二步,递归方式继续调用该方法遍历左孩子
遍历(t.左孩子)
//第三步,递归方式继续调用该方法遍历右孩子
遍历(t.右孩子)
}

我们看到因为print在其他方法的前面,所以叫前序遍历。我们现在传入根结点到这个方法,然后依次打印并且递归,就会发现,就是图上的顺序。

中序遍历:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

伪代码:

遍历(结点对象 t){

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

总结

最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的Android开发中高级必知必会核心笔记,共计2968页PDF、58w字,囊括Android开发648个知识点,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。

虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。

虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值