数据结构里各种难啃的“树”,一文搞懂它(1)

完全二叉树与满二叉树

3 常见的存储方法

============================================================================

我们知道数组最大的一个特点就是内存连续,方便随机访问,下标通常从0开始。好了,知道这些我们就先看看用数组如何存储一棵二叉树。

数据结构里各种难啃的“树”,一文搞懂它

数组方式

我们了解了二叉树的一点基本概念后,为了表示节点之间的关系,引入链表结构,用左右两个指针分别指向左节点和右节点,这样就可以串联整个二叉树,如下图所示。

数据结构里各种难啃的“树”,一文搞懂它

链表方式

3 二叉树的遍历

===========================================================================

先序遍历:访问根节点,访问当前节点的左子树;若当前节点无左子树,则访问当前节点的右子树;

数据结构里各种难啃的“树”,一文搞懂它

先序遍历

中序遍历访问当前节点的左子树;访问根节点;访问当前节点的右子树;

数据结构里各种难啃的“树”,一文搞懂它

中序遍历

后序遍历:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素。

数据结构里各种难啃的“树”,一文搞懂它

后序遍历

层次遍历:从上往下一层一层遍历

数据结构里各种难啃的“树”,一文搞懂它

层次遍历

二、 二叉排序树

===========================================================================

二叉排序树(Binary Sort Tree)又称二叉查找树、二叉搜索树。它或者是一棵空树;或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

数据结构里各种难啃的“树”,一文搞懂它

其高度与树中结点个数n成对数关系,检索的时间开销为O(logn)。但是很有可能检索的时间将变成线性的情况。

数据结构里各种难啃的“树”,一文搞懂它

三、 哈夫曼树

==========================================================================

哈夫曼树也叫做最优二叉树,一种带权路径长度最短的二叉树。那么什么是树的带权路径长度,它是树中所有的叶子节点的权值乘上其根节点的路径长度。

1 如何构造哈夫曼树

=============================================================================

数据结构里各种难啃的“树”,一文搞懂它

构造哈夫曼树

四、 平衡二叉树

===========================================================================

之前我们知道了二叉排序树出现了线性的情况,所以需要想办法避免那种情况发生。这样两位爷爷发明了平衡二叉排序树,又叫AVL树。那么是怎么定义的呢?平衡二叉排序树是一类特殊的二叉排序树,它或者为空树,或者其左右子树都是平衡二叉排序树,而且其左右的子数高度之差绝对值不超过1.为了保证相对平衡,每次插入元素都会做相应的旋转,那么下面来看看这几种情况。

1 平衡二叉树与非平衡二叉树

=================================================================================

数据结构里各种难啃的“树”,一文搞懂它

平衡二叉树与非平衡二叉树

2 平衡调整

=========================================================================

LL型调整

如下图,因为在A的左孩子的左孩子插入新的节点,导致A的平衡因子从1变为2,不在满足根本性质[-1,1],所以需要通过旋转。显然,按照大小关系,结点B应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,这样看来,仿佛A结点绕结点B顺时针旋转一样。

数据结构里各种难啃的“树”,一文搞懂它

下图中,当在节点5的左子树中插入节点的时候而导致不平衡。这种情况调整如下:首先将元素5的左孩子2提升为新的根结点;然后将原来的根结点元素5变为元素2的右孩子;其他各子树按大小关系连接。

数据结构里各种难啃的“树”,一文搞懂它

RR型调整

如下图,因为在元素5的右孩子的右孩子插入新的节点,导致元素5的平衡因子从-1变为-2,不在满足根本性质[-1,1],所以需要通过旋转。显然,按照大小关系,结点元素7应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡,这样看来,仿佛节点元素5绕结点元素7逆时针旋转一样。

数据结构里各种难啃的“树”,一文搞懂它

RR型调整的一般形式如下图所示,表示节点元素4的右子树5(不一定为空)中插入结点(图中阴影部分所示)而导致不平衡( h 表示子树的深度)。这种情况调整如下:

数据结构里各种难啃的“树”,一文搞懂它

LR调整

由于节点元素5的左孩子的右子树上插入新节点,导致不平衡。此时元素5的平衡因子由1变为2。第一张图是LR型的最简单形式。显然,按照大小关系,元素3应作为新的根结点,其余两个节点分别作为左右孩子节点才能平衡。

数据结构里各种难啃的“树”,一文搞懂它

由于节点元素6增加一个左孩子,导致元素4变得不平衡。先顺时针旋转元素7再逆时针旋转4元素达到平衡。

数据结构里各种难啃的“树”,一文搞懂它

RL调整

当在元素5的右孩子的左子树增加一个节点7的时候,会造成不平衡的情况。先逆时针旋转成RR情况,再将元素5顺时针旋转。

数据结构里各种难啃的“树”,一文搞懂它

第二种情况方法类似,看起来会复杂一点。当在元素7得左孩子6增加左孩子元素5得时候,导致元素4变得不平衡。那么先顺时针调整元素7,再逆时针调整元素4

数据结构里各种难啃的“树”,一文搞懂它

五、 B树和B+树

============================================================================

小伙伴们有没有想过,为什么很多数据库中的索引采用B+树呢?以及为什么索引是放在磁盘上。

1 B树

=======================================================================

如果使用二叉树作为索引的底层实现结构,树会变得很高,从而增加了磁盘的IO次数,从而影响数据查询时间。因此为了降低其高度,让一个节点有多个子节点,B树就诞生了。

B树的容颜

数据结构里各种难啃的“树”,一文搞懂它

一个M阶B树的哪些特性

官方英文

1、Every node has at most m children.

2、Every non-leaf node (except root) has at least [m/2] child nodes.

3、The root has at least two children if it is not a leaf node.

4、A non-leaf node with k children contains k − 1 keys.

5、All leaves appear in the same level.

中文

  • 根节点的儿子数量范围[2,M]

  • 每个中间节点包含 k-1 个关键字和 k 个孩子,孩子的数量 = 关键字的数量 +1,k 的取值范围为 [ceil(M/2), M]。

  • 叶子节点包括 k-1 个关键字(叶子节点没有孩子),k 的取值范围为 [ceil(M/2), M]。

  • 假设中间节点节点的关键字为:Key[1], Key[2], …, Key[k-1],且关键字按照升序排序,即 Key[i]<Key[i+1]。此时 k-1 个关键字相当于划分了 k 个范围,也就是对应着 k个指针,即为:P[1], P[2], …, P[k],其中 P[1] 指向关键字小于 Key[1] 的子树,P[i] 指向关键字属于 (Key[i-1], Key[i]) 的子树,P[k] 指向关键字大于 Key[k-1] 的子树。

  • 所有叶子节点位于同一层。

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

Kafka进阶篇知识点

image

Kafka高级篇知识点

image

44个Kafka知识点(基础+进阶+高级)解析如下

image

由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
722570)]

Kafka高级篇知识点

[外链图片转存中…(img-UEIGlXTA-1713714722570)]

44个Kafka知识点(基础+进阶+高级)解析如下

[外链图片转存中…(img-rDySQF3W-1713714722570)]

由于篇幅有限,小编已将上面介绍的**《Kafka源码解析与实战》、Kafka面试专题解析、复习学习必备44个Kafka知识点(基础+进阶+高级)都整理成册,全部都是PDF文档**

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 20
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值