红黑树的特性

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。[这里指到叶子节点的路径]

 

当新添加一个节点到树中后,将其颜色置为red,遵循以下原则对整个树进行调整:

1、  当插入的节点的父节点为null,则将该节点颜色置为black。

2、  当插入节点的父节点颜色为black,不需要调整。

3、  当插入节点的父节点为red,其叔父节点亦为红色,则将其父亲节点和叔父节点置为black,同时将祖父节点置为red,将祖父节点设置为当前新增节点,重新按照从规则1开始判断。

4、  但插入节点的父亲节点为red,其叔父节点为black或null,则需要分多钟情况考虑。

a)         新增节点为父亲节点右孩子同时父亲节点是祖父节点的左孩子,则进行左旋,将父节点置为新节点,重新按照规则1进行判断;

b)         新增节点为父亲节点左孩子,同时父亲节点是租户节点的右孩子,则进行右旋,将父节点置为新节点,重新按照规则1进行判断;

5、  不满足上述所有条件,将父节点置为black,同时,将祖父节点置为red,进行以下两种情况判断。

a)         如果新增节点是父亲节点的左孩子,同时,父亲节点是祖父孩子的左孩子,则对祖父节点进行右旋

b)         其他情况,对祖父节点左旋。

通过以下序列来实现:35、75、65、56、78、29、41、37、38

第一步,首先加入35,只有根节点,按照规则1,将其颜色设置为black。

 

 

第二步,添加75节点,由于75节点的值大于当前根节点的值35,因此需要添加到根节点右侧,根据规则2,其父亲节点为black,不需要调整。

 

 

第三步,添加65节点,由于65大于35且小于75,因此,需要添加在75节点的左节点。根据规则4(a)规则进行调整,对父亲节点进行右旋,之后按照5(b),进行调整后,满足条件不需要再次调整。得到如下结果。

                                      

 

              

第三步,将56添加到现有的结果中,需要对先按照规则3进行调整,之后按照规则1调整,得到如下结果。

                                

 

 

 

第四步,将78添加到现有的树中,为75的右节点,满足条件2不需要进行调整。

 

 

第五步,将29添加的树中。满足条件2不需要进行调整。

 

 

第六步。将41添加的树中,按照规则3对其进行颜色调整,之后在按照规则2进行调整,满足条件。

                   

 

 

第七步,将37添加到树中,需要进行5(b)调整。

               

 

 

第八步,将38添加到树中,按照条件3进行调整,将37和56置black,同时,将41置为red,将41节点置为当前节点重新判断;之后按照4(a)进行调整,将父节点35置为新节点,继续判断;按照5(a)进行最后调整,满足条件。

                                                                             

 

 

 

 

红黑树在线生成链接:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

 

 

转载于:https://www.cnblogs.com/woniu4/p/8086707.html

<think>我们正在讨论红黑树特性原理。根据引用内容,红黑树是一种自平衡的二叉查找树,它通过特定的规则(颜色属性)来保持树的平衡,从而保证操作的高效性(O(logN)时间)。 引用[2]详细说明了红黑树的五个基本性质(颜色、根黑、叶黑、不红红、黑路同)。引用[5]提到插入结点时的调整策略(插入红色结点,然后调整违反的约束)。 因此,回答将围绕红黑树特性(五个性质)和平衡原理(插入、删除时的调整)展开。</think>### 红黑树数据结构特性原理详解 红黑树是一种**自平衡的二叉查找树**,通过特定规则维持树的平衡性,确保在最坏情况下仍能保持 $O(\log n)$ 的时间复杂度。其核心特性原理如下: --- #### 一、五大基本特性(平衡基础)[^2][^4] 1. **颜色属性** 每个节点必须为红色或黑色,这是红黑树平衡的核心机制。 2. **根节点约束** 根节点必须为黑色:$\textcolor{red}{\text{root}} \rightarrow \text{black}$ 3. **叶子节点规则** 所有叶子节点(NIL节点)均为黑色。 4. **红色节点限制** 红色节点的子节点必须为黑色(禁止连续红节点): $\text{red} \rightarrow \text{black children}$ 5. **黑高平衡(关键特性)** 从任意节点到其所有叶子节点的路径包含相同数量的黑色节点(黑高相同): $$\forall \text{ node } \exists k \in \mathbb{Z}^+ : \text{black-height} = k$$ --- #### 二、平衡原理操作 ##### 1. 平衡性保证 - **黑高约束**:确保最长路径不超过最短路径的2倍 设黑高为 $h$,则: - 最短路径:全黑节点(长度 $h$) - 最长路径:红黑交替(长度 $2h$) 满足 $\text{max-path} \leq 2 \times \text{min-path}$ ##### 2. 插入操作[^5] - **默认插入红色节点**(减少违反黑高约束的概率) - 调整情况: - **场景1**:插入根节点 → 染黑(满足特性2) - **场景2**:父节点为黑 → 无需调整 - **场景3**:父节点为红 → 通过旋转+变色恢复平衡 ![](https://assets.leetcode.com/uploads/2020/10/05/insert_case3.png) *插入后连续红节点(违反特性4)的调整示例* ##### 3. 删除操作 - 删除后可能破坏黑高平衡 - 通过**旋转+重新着色**修复: - 兄弟节点借调 - 向上递归调整 --- #### 三、性能优势[^3] | 操作 | 时间复杂度 | 原因 | |------------|------------|----------------------| | 查找 | $O(\log n)$ | 树高度平衡 | | 插入 | $O(\log n)$ | 最多3次旋转完成调整 | | 删除 | $O(\log n)$ | 递归调整不超过树高度 | > 对比普通BST:最坏情况退化为链表($O(n)$) --- #### 四、应用场景 1. **高效查找结构** - C++ STL:`std::map`, `std::set` - Java:`TreeMap`, `HashMap`(Java 8+桶冲突处理) 2. **数据库系统** - 索引实现(如MySQL的InnoDB引擎) 3. **实时系统** - 保证操作时间上限(无$O(n)$退化风险) --- #### 五、对比其他平衡树 | 特性 | 红黑树 | AVL树 | B树 | |--------------|----------------------------|--------------------|--------------------| | **平衡标准** | 黑高相同 | 严格高度平衡 | 节点最小度数 | | **旋转次数** | 插入最多2次,删除最多3次 | 可能频繁旋转 | 节点分裂/合并 | | **适用场景** | 频繁插入删除 | 查询密集型 | 磁盘存储系统 | | **内存占用** | 1 bit/节点(颜色标记) | 平衡因子存储 | 多键值/节点 | > 红黑树在插入删除频繁的场景中综合性能最优[^3][^4] --- ### 总结 红黑树通过**颜色标记+五大约束**实现高效自平衡,其核心是: 1. 利用**黑高平衡**限制路径长度差异 2. **插入红色节点+动态调整**减少平衡开销 3. **旋转+变色**操作保证操作后仍满足特性 这种设计使其成为工业级应用中最高效的平衡树之一,尤其适合需要频繁更新的场景[^1][^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值