- 2
- 0
- 约8.69千字
- 约 23页
- 2025-09-21 发布于河北
- 举报
红黑树的旋转操作示例演示
一、红黑树旋转操作概述
红黑树是一种自平衡二叉查找树,其通过旋转和重新着色操作来维护平衡。旋转操作主要分为左旋和右旋两种,用于调整树的结构,确保红黑树的性质得以保持。本演示将通过具体步骤展示红黑树的旋转操作过程,包括左旋和右旋的应用场景及实现方法。
二、左旋操作
左旋操作用于将红黑树中某个节点的右子节点提升为父节点,同时调整相关节点的位置和颜色,以维持红黑树的性质。
(一)左旋操作适用场景
1.红黑树中存在“右右”情况(即父节点为红色,其右子节点也为红色,且右子节点的右子节点为黑色)。
2.通过左旋可以修复红黑树的平衡,避免连续红色节点的出现。
(二)左旋操作步骤(以节点X为根节点进行操作)
1.将X的右子节点Y设为新的根节点。
2.将X作为Y的左子节点。
3.如果Y有左子节点Z,将Z设为X的右子节点。
4.调整节点的颜色:
-若X原本为红色,Y设为黑色,且X的右子节点(若存在)设为黑色。
-若X原本为黑色,则不改变颜色。
(三)左旋操作示例
假设树结构如下:
X(红)
/\
T1Y(红)
/\
T2Z(黑)
左旋后结构变为:
Y(黑)
/\
X(红)T2
/\
T1Z(黑)
三、右旋操作
右旋操作与左旋操作相反,用于将红黑树中某个节点的左子节点提升为父节点,同时调整相关节点的位置和颜色。
(一)右旋操作适用场景
1.红黑树中存在“左左”情况(即父节点为红色,其左子节点也为红色,且左子节点的左子节点为黑色)。
2.通过右旋可以修复红黑树的平衡,避免连续红色节点的出现。
(二)右旋操作步骤(以节点X为根节点进行操作)
1.将X的左子节点Y设为新的根节点。
2.将X作为Y的右子节点。
3.如果Y有右子节点Z,将Z设为X的左子节点。
4.调整节点的颜色:
-若X原本为红色,Y设为黑色,且X的左子节点(若存在)设为黑色。
-若X原本为黑色,则不改变颜色。
(三)右旋操作示例
假设树结构如下:
X(红)
/\
Y(红)T2
/\
T1Z(黑)
右旋后结构变为:
Y(黑)
/\
T1X(红)
/\
ZT2
四、旋转操作的应用
旋转操作是红黑树维护平衡的核心机制,实际应用中通常结合左右旋和着色操作共同使用。以下是一个综合示例:
(一)初始树结构(存在“右右”情况)
15(红)
/\
10(黑)17(红)
/\
13(黑)20(红)
/\
1214
(二)第一步:对节点17进行左旋
15(红)
/\
10(黑)13(红)
/\
1217(黑)
/\
1420(红)
(三)第二步:对节点13进行右旋
15(红)
/\
10(黑)17(红)
/\
1213(黑)
/\
1420(红)
(四)调整颜色并验证平衡
-将节点15设为黑色,节点13设为红色,节点17设为黑色。
-最终树结构满足红黑树性质,无连续红色节点。
四、旋转操作的应用(续)
(一)综合旋转与着色示例详解
在实际的红黑树插入或删除操作中,很少仅通过一次旋转就能完成平衡调整。通常需要结合多次旋转(左旋、右旋)以及重新着色来修复因插入或删除节点而破坏的红黑树性质。以下通过一个更详细的插入场景,演示旋转与着色的综合应用。
场景:向红黑树中插入节点值为9的节点。假设初始部分树结构如下(为简化,忽略部分黑色高度指示,假设根节点为黑色):
10(黑)
/\
5(黑)15(黑)
\/\
71217
/\\
3620
插入节点9后,在节点5的右子树中插入,导致节点10和15之间出现连续红色节点(10红色,15红色,其父节点5为黑色),违反了红黑树的性质4(没有两个相邻的红色节点)。此时需要通过旋转和着色进行修复。
步骤1:首次旋转与着色
1.问题识别:节点15是节点10的右子节点,且节点10和15都为红色,其父节点5为黑色。这是一个典型的“右右”情况(相对于节点10)。
2.执行左旋:对节点10执行左旋。左旋以节点10为中心。
节点15成为新的父节点,节点10成为节点15的左子节点。
原节点10的右子节点(即节点17)成为节点15的右子节点。
原树结构:
```
10(红)
/\
5(黑)15(红)
\/\
71217
/\\
3620
```
左旋后结构:
```
15(黑)
/\
10(红)17
/\
5(黑)1
原创力文档

文档评论(0)