java-数据结构—树

目录

树的组成

节点

根节点

其他组成部分

二叉树

普通二叉树

二叉查找树

二叉树的遍历

前序遍历

中序遍历

后序遍历

层序遍历

总结

平衡二叉树

平衡二叉树的旋转机制

左旋

右旋

需要旋转的四种情况

左左

左右

右右

右左

总结

红黑树


树的组成

节点

先引入树的组成:节点

节点又分为父节点,左子节点和右子节点

节点的组成是什么呢

度:是每一个节点的子节点的数量

所以在二叉树中,任意节点的度<=2

根节点

最顶层的节点

其他组成部分

二叉树

普通二叉树

满足度小于等于2的普通的树

二叉查找树

特点:度小于等于2

左子节点小于当前节点

右子节点小于当前节点

二叉树的遍历

我也不知道如何介绍,看图片以及结合文字思考一下,很容易就能明白

图片左侧是遍历后的结果,顺序是从左往右,从上往下

前序遍历

中序遍历

后序遍历

层序遍历

总结

平衡二叉树

规则:任意节点左右子树高度差不超过1

如下图,你不能只看根节点,你还得看其他的所有节点,看看所有节点的左右子树高度差是否超过一;

注意:没有左(右)节点时,我们认为该节点的左(右)节点的高度为0

举例:左侧二叉树的10节点,他没有左节点,所以左节点高度为0,右节点高度为3,高度差为3,所以不是平衡二叉树

平衡二叉树的旋转机制

旋转分为左旋和右旋;

触发时机:当添加一个节点后,平衡二叉树不再平衡,就要进行相应的旋转

左旋

类型一:不平衡的节点不是根节点时

举个例子:

下图是一个平衡二叉树

在11节点处添加右节点12,此时二叉树不再平衡,如下图

然后我们要找到导致不平衡的节点

方法如下:也就是从我们添加的12节点处开始往上找,判断节点是否平衡,知道找到不平衡的节点为止,如下图我们找到了10

所以接下来我们要对其进行左旋

步骤如下图

类型二:不平衡的节点是根节点时

举例

加节点前

加节点后

找不平衡节点

最后发现是根节点7不平衡

进行左旋

步骤如下图

右旋

这个和左旋基本操作类似,所以我不多加详细介绍了,直接给图

类型一:不平衡的节点不是根节点时

右旋前

右旋后

类型二:不平衡的节点是根节点时

右旋前

右旋后

需要旋转的四种情况
左左

旋转前,添加节点分别是1和3

旋转后

左右

旋转前,添加节点为6

第一次局部左旋,变成左左的情况

第二次整体右旋

右右

旋转前,12为添加节点

一次左旋即可

右左

旋转前,8为添加节点

对根节点的右子树进行局部右旋,得到

此时变为了右右的情况了,再对他进行整体左旋

总结

红黑树

(有点复杂,不好讲述,自行看图片介绍)

是一个二叉查找树,高度不平衡,满足红黑规则

红黑规则

添加节点的规则

注意:这里的叔叔,个人认为是伯伯,比较是父亲的兄弟,也就是说,如果父是左(右)子节点,则叔就是右(左)子节点

其余的自己看,按照步骤走

相关推荐
鹿角片ljp4 分钟前
力扣110.平衡二叉树-递归
数据结构·算法·leetcode
一起养小猫4 分钟前
《Java数据结构与算法》第四篇(三)二叉树遍历详解_CSDN文章
java·开发语言·数据结构
im_AMBER4 分钟前
Leetcode 80 统计一个数组中好对子的数目
数据结构·c++·笔记·学习·算法·leetcode
少许极端5 分钟前
算法奇妙屋(十九)-子序列问题(动态规划)
java·数据结构·算法·动态规划·子序列问题
尘诞辰23 分钟前
【C语言】数据在内存中的储存
c语言·开发语言·数据结构·c++
无限进步_32 分钟前
【C语言】栈(Stack)数据结构的实现与应用
c语言·开发语言·数据结构·c++·后端·visual studio
embrace9932 分钟前
【C语言学习】预处理详解
java·c语言·开发语言·数据结构·c++·学习·算法
重生之我是Java开发战士44 分钟前
【数据结构】优先级队列(堆)
java·数据结构·算法
菜鸟233号44 分钟前
力扣216 组合总和III java实现
java·数据结构·算法·leetcode
AuroraWanderll1 小时前
类和对象(三)-默认成员函数详解与运算符重载
c语言·开发语言·数据结构·c++·算法