红黑树(red-black tree)构造过程(其本质上是2-3-4树)

1. 定义

红黑树是满足下列条件的二叉查找树
每个节点都带有红色或黑色。节点的颜色由以下规则确定:
根节点是黑色的。
所有叶节点都是黑色的。
在沿着从根出发的任何路径上都不允许出现两个连续的红色节点,即:“红色”结点的两个子结点都是“黑色”的。
从任一节点到其每个子孙叶子节点的所有简单路径都包含相同数目的黑色节点(简称黑色高度)
节点X的黑色高度:从节点X到其子孙叶子节点的简单路径中的黑色链的数量。
红黑树的黑色高度:根节点的黑色高度(称为:根节点的阶)
红黑树的两种不同定义:
《算法导论》:叶子节点是指,扩充外部叶结点。即叶子节点为空的“黑色”节点
- 可以认为是2-3-4树的二叉树实现
《程序员实用算法》:数据只存储在叶子节点中,内部节点只用于引用;

示例: 	
《算法导论》中的红黑树,,黑色高度为2。

算法导论中的红黑树

《程序员实用算法》中的红黑树,黑色高度为2。加粗为黑色结点

在这里插入图片描述
本文基于《算法导论》的定义介绍。

2. 红黑树 与 2-3-4树

红黑树,可等价转化为2-3-4树。

为了更好的理解红黑树,先看一下2-3-4树

2.1 2-3-4树介绍

2-3-4树:

2-3-4树
2-3-4树:
是二叉查找树的扩展
树中每个节点中有1个或2个或3个关键字,节点内部是有序的。
2-节点:有1个关键字,2个孩子
3-节点:有2个关键字,3个孩子
4-节点:有3个关键字,4个孩子
具有很好的平衡性:所有叶子节点的深度相同。

2-3-4树的查找

在这里插入图片描述
插入B结点
在这里插入图片描述在这里插入图片描述
插入结点H
在这里插入图片描述在这里插入图片描述在这里插入图片描述
注意:在插入结点过程中,按照自顶向下的方式进行访问,当发现4-节点时,进行分裂。
即:插入结点时在遍历查找插入位置的路线上,凡是遇到4-结点,就对其进行分裂
在这里插入图片描述
现在,自顶向下构造一棵2-3-4树
在这里插入图片描述
在这里插入图片描述

2.2 二叉树来实现2-3-4树

2-3-4树中有三类节点:
2-节点,3-节点和4-节点
对于3-节点和4-节点,利用红色链来绑定“内部”节点
红色链所指向的节点为红色节点(红色链下方的结点)

在这里插入图片描述
2-节点不变
3-节点变为用红色链连接的两个二叉树节点,指向外部孩子节点的指针为3个,数量不变。
4-节点转化为三个用红色链连接起来的二叉树节点,指向外部孩子节点的指针为4个,数量不变。

这样,2-3-4树就转化成了二叉树。
在这里插入图片描述
但是,可以看到,2-3-4树对应的二叉树并不唯一,哪种才是等价的红黑树呢?

2-3-4树的2-节点和4-节点变成成二叉树节点都是唯一的情况,3-节点呢?
我们人为的规定,转换成左分支的情况,(左孩子节点小于父节点,二叉查找树的性质)
并且在插入新节点的过程中,产生右分支的时候我们需要把它左旋成为左分支情况。
这样,2-3-4树就对应成了唯一的二叉树,即红黑树。(红色链连接代表着2-3-4树节点内部的连接,红色链下方的节点表示红色节点)

那么,现在还剩下一个问题,2-3-4树插入节点过程中的4-节点分裂,对应着二叉树怎样的变化呢?

2-3-4树中,双亲为2-节点时,4-节点的分裂:
2-3-4树4-节点分裂对应着二叉树的颜色向上翻转,当翻转后出现,右分支情况的3-节点时,旋转成左分支情况
在这里插入图片描述
2-3-4树中,双亲为3-节点时,4-节点的分裂:
在对应二叉树中,同样可以用颜色翻转和旋转等价实现。

当反转后,出现两个红色节点连续,显然不满足红黑树的定义,要进行旋转,旋转规则类似与AVL树失衡的旋转处理。
下面的两个旋转情况,和AVL树LL失衡,LR失衡旋转情况相同

在这里插入图片描述

3.总结:红黑树,本质上是2-3-4树

两类基本操作:

颜色翻转
实质上为4-节点分裂
当某个结点的两个孩子结点都为红色时
将两个红色孩子结点和其黑色双亲结点的颜色翻转
旋转
避免出现连续的两条红色链;避免出现单个的红色右链。
出现右的红色链时:对于右的红色链,进行左旋处理
有连续两个红色链时:
依据两个连续的红色链的形状,进行相应的旋转处理(类似AVL树的失衡旋转规则)

看道小试题,
从空树出发,根据待插入的关键字序列 {03,02,01,04,05,06,07,10,09,08}.构建红黑树。

仔细体会一下红黑树的构建过程。
可以画出对应2-3-4树的插入构建过程和红黑树对比加深理解。

(节点依次插入,树未发生翻转变化时省略了重复画图)
注意:将红色链指向(下方)的节点定义为红色节点,不要迷惑于红色节点的变化
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值