java-数据结构—树

目录

树的组成

节点

根节点

其他组成部分

二叉树

普通二叉树

二叉查找树

二叉树的遍历

前序遍历

中序遍历

后序遍历

层序遍历

总结

平衡二叉树

平衡二叉树的旋转机制

左旋

右旋

需要旋转的四种情况

左左

左右

右右

右左

总结

红黑树


树的组成

节点

先引入树的组成:节点

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

节点的组成是什么呢

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

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

根节点

最顶层的节点

其他组成部分

二叉树

普通二叉树

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

二叉查找树

特点:度小于等于2

左子节点小于当前节点

右子节点小于当前节点

二叉树的遍历

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

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

前序遍历

中序遍历

后序遍历

层序遍历

总结

平衡二叉树

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

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

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

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

平衡二叉树的旋转机制

旋转分为左旋和右旋;

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

左旋

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

举个例子:

下图是一个平衡二叉树

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

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

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

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

步骤如下图

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

举例

加节点前

加节点后

找不平衡节点

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

进行左旋

步骤如下图

右旋

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

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

右旋前

右旋后

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

右旋前

右旋后

需要旋转的四种情况
左左

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

旋转后

左右

旋转前,添加节点为6

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

第二次整体右旋

右右

旋转前,12为添加节点

一次左旋即可

右左

旋转前,8为添加节点

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

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

总结

红黑树

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

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

红黑规则

添加节点的规则

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

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

相关推荐
0566461 天前
Python康复训练——数据结构
数据结构·windows·python
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-27 冒泡法排序(C语言实现)
c语言·开发语言·数据结构·算法
noipp1 天前
推荐题目:洛谷 P5843 [SCOI2012] Blinker 的噩梦
c语言·数据结构·c++·算法·游戏·洛谷·luogu
冻柠檬飞冰走茶1 天前
PTA基础编程题目集 7-20 打印九九口诀表(C语言实现)
c语言·开发语言·数据结构·算法
红叶舞1 天前
基于线段树的数据结构
数据结构·python·算法
断点之下1 天前
从“理扑克牌”到“分组优化”——直接插入排序与希尔排序详解
数据结构·算法·排序算法
起个破名想半天了1 天前
算法与数据结构之DFS深度优先遍历
数据结构·算法·深度优先
鱼子星_1 天前
【C++】深入剖析list:list及其双向迭代器实现
开发语言·数据结构·c++·笔记·stl·list
江屿风1 天前
【C++笔记】【二叉搜索树】流食般投喂
开发语言·数据结构·c++·笔记
爱吃提升2 天前
MATLAB矩阵运算完全指南:从生成到索引操作
数据结构·matlab·矩阵