平衡二叉树和红黑树

目录

一、平衡二叉树

1.旋转分类

(1)左旋

(2)右旋

2.需要旋转的四种情况 

(1)左左

​编辑(2)左右

​编辑

(3)右右

(4)右左

二、红黑树 

1.红黑树的特点

2.红黑规则 

3.添加节点后如何保持规则(违规才需要做)

 4.示例

(1)添加20

(2)添加18

(3)添加23

(4)添加22

(5)添加17

(6)添加24和19

(7)添加15

(8)添加16


一、平衡二叉树

平衡二叉树就是在二叉查找树的基础上+旋转规则

旋转的目的是要:控制每一个节点的左右子树高度相差不大于1.

1.旋转分类

(1)左旋

A.确定支点:从添加的节点开始,不断的往父节点找不平衡的节点

简单的   B.以不平衡的点作为支点,把支点左旋降级,变成左子节点,晋升原来的右子节点

复杂的   B. 以不平衡的点作为支点,将根节点的右侧往左拉,原先的右子节点变成新的父节点,并把多余的左子节点出让,给已经降级的根节点当右子节点

下面是简单和复杂左旋的结果:

(2)右旋

A.确定支点:从添加的节点开始,不断的往父节点找不平衡的节点

简单的   B.以不平衡的点作为支点,把支点右旋降级,变成右子节点,晋升原来的左子节点

复杂的   B. 以不平衡的点作为支点,将根节点的左侧往右拉,原先的左子节点变成新的父节点,并把多余的右子节点出让,给已经降级的根节点当左子节点

下面是简单和复杂右旋的结果:

2.需要旋转的四种情况 

(1)左左

当根节点左子树的左子树有节点插入,导致二叉树不平衡

 

如何旋转:一次复杂右旋

旋转结果如下

(2)左右

当根节点左子树的右子树有节点插入,导致二叉树不平衡

如何旋转: 先在左子树对应的节点位置进行左旋,在对整体进行右旋

一次局部左旋和一次复杂右旋的过程图如下:

(3)右右

当根节点右子树的右子树有节点插入,导致二叉树不平衡

如何旋转: 直接对整体进行左旋即可

(4)右左

当根节点右子树的左子树有节点插入,导致二叉树不平衡

如何旋转: 先在右子树对应的节点位置进行右旋,在对整体进行左旋

一次局部右旋和一次复杂左旋的过程图如下:

二、红黑树 

1.红黑树的特点

  • 平衡二叉B树,二叉查找树

  • 每一个节点可以是红或者黑

  • 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的

2.红黑规则 

  1. 每一个节点或是红色的,或者是黑色的

  2. 根节点必须是黑色

  3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,每个叶节点(Nil)是黑色的

  4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连 的情况)

  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径(不能回头)上,均包含相同数目的黑色节点

 简单记就是

3.添加节点后如何保持规则(违规才需要做)

 

 4.示例

将下面数据按从左到右的顺序添加构造红黑树:

20      18      23      22       17       24        19         15         16

添加节点时,默认为红色,效率高

(1)添加20

违反规则根节点必须是黑色,按照3维护红黑树

(2)添加18

没有违反规则

(3)添加23

没有违反规则

(4)添加22

违反规则两红不能在一起, 按照3维护红黑树

(5)添加17

没有违反规则

 

(6)添加24和19

都没有违反规则

(7)添加15

违反规则两红不能在一起, 按照3维护红黑树

(8)添加16

违反规则两红不能在一起, 按照3维护红黑树

  • 16
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值