java-数据结构—树

目录

树的组成

节点

根节点

其他组成部分

二叉树

普通二叉树

二叉查找树

二叉树的遍历

前序遍历

中序遍历

后序遍历

层序遍历

总结

平衡二叉树

平衡二叉树的旋转机制

左旋

右旋

需要旋转的四种情况

左左

左右

右右

右左

总结

红黑树


树的组成

节点

先引入树的组成:节点

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

节点的组成是什么呢

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

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

根节点

最顶层的节点

其他组成部分

二叉树

普通二叉树

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

二叉查找树

特点:度小于等于2

左子节点小于当前节点

右子节点小于当前节点

二叉树的遍历

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

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

前序遍历

中序遍历

后序遍历

层序遍历

总结

平衡二叉树

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

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

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

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

平衡二叉树的旋转机制

旋转分为左旋和右旋;

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

左旋

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

举个例子:

下图是一个平衡二叉树

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

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

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

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

步骤如下图

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

举例

加节点前

加节点后

找不平衡节点

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

进行左旋

步骤如下图

右旋

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

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

右旋前

右旋后

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

右旋前

右旋后

需要旋转的四种情况
左左

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

旋转后

左右

旋转前,添加节点为6

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

第二次整体右旋

右右

旋转前,12为添加节点

一次左旋即可

右左

旋转前,8为添加节点

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

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

总结

红黑树

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

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

红黑规则

添加节点的规则

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

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

相关推荐
奔跑吧 android6 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 2】【通过一个案例属性list、hlist、rbtree、xarray数据结构使用】
linux·数据结构·list·kernel·rbtree·hlist·xarray
默默无名的大学生7 小时前
数据结构—顺序表
数据结构·windows
Jared_devin8 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
AI 嗯啦9 小时前
数据结构深度解析:二叉树的基本原理
数据结构·算法
hai_qin9 小时前
十三,数据结构-树
数据结构·c++
和光同尘@10 小时前
66. 加一 (编程基础0到1)(Leetcode)
数据结构·人工智能·算法·leetcode·职场和发展
我爱996!11 小时前
LinkedList与链表
数据结构·链表
yb0os111 小时前
RPC实战和核心原理学习(一)----基础
java·开发语言·网络·数据结构·学习·计算机·rpc
hope_wisdom12 小时前
C/C++数据结构之栈基础
c语言·数据结构·c++··stack
野犬寒鸦13 小时前
力扣hot100:环形链表(快慢指针法)(141)
java·数据结构·算法·leetcode·面试·职场和发展