| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C/C++数据结构之红黑树详解 -> 正文阅读 |
|
[C++知识库]C/C++数据结构之红黑树详解 |
红黑树含义红黑树是一个二叉排序树,是key-value结构。红黑树是强查找的数据结构。
1
2
3
4
5
6
7
8
9
header
红黑树具有一下性质: 应用场景(1)hashmap。 代码实现红黑树定义红黑树
红黑树的旋转当红黑树的性质被破环时,需要触发旋转,进行调整。
左旋
右旋
6
root
4
2
1
3
5
8
7
9
1
2
3
4
5
6
7
8
9
root
左旋需要改变三个方向共六个指针的指向:X的右指针、Y的左指针,X父结点的指针;这三个指针是双向的,所以是六个指针(比如X的右指针指向Y,Y的父指针指向X)。即X的右指针改为指向Y的左结点,Y的左指针改为指向X,X的父结点指针改为指向Y。
红黑树插入结点红黑树插入结点之前,它已经是一颗红黑树。插入的结点上的色是红色,因为这样不会改变黑高; 然后做调整。 红黑树插入结点时要插到底部。至于插入的key是否已存在,取决于业务场景,不属于红黑树的管理。 当插入结点时,可以推断出以下情况(比如插入的结点是z): 因此,插入情况:
右旋
父结点是左子树并且叔结点是黑色, z = 8
8
10
14
20
nil
调整后
8
10
14
nil
20
父结点是左子树并且叔结点是红色, z = 10
8
10
14
20
nil
调整后
8
14
20
10
nil
父结点是祖父结点的左子树的情况(1)叔结点是红色的。
调整前 z=89,y=789
123
89
345
789
nil
调整后 z=345
123
345
789
89
nil
调整前 z=89,y=789
123
234
345
789
nil
调整后 z=345
123
345
789
89
nil
(2)叔结点是黑色的,而且当前结点是左孩子。
调整前 z=123,y=789
89
123
140
145
150
189
345
789
921
nil
nil
调整后 z=123
123
150
345
89
145
140
nil
189
789
nil
921
(3). 叔结点是黑色的,而且当前结点是右孩子
调整后 z=123
89
123
140
145
150
189
345
789
nil
921
nil
调整前 z=150, y=789
345
123
89
150
145
189
140
nil
789
nil
921
父结点是祖父结点的右子树的情况这种情况和【父结点是祖父结点的左子树的情况】同理。
示例代码
红黑树删除结点红黑树删除的结点有几个情况:
删除后
10
15
8
nil
16
nil
20
删除 z=13
8
10
20
13
15
16
nil
(2)结点有左子树或右子树。
删除后
10
15
8
13
20
删除 z=16
8
10
20
13
15
16
nil
代码实现:
(3)结点有左子树且有右子树
删除后
11
15
8
13
12
14
16
nil
20
中间状态
替换
10
15
8
13
12
14
16
nil
20
11
删除 z=10
8
10
11
20
13
14
15
16
nil
nil
12
代码实现:
当前结点是父结点的左子树的情况(1)当前结点的兄弟结点是红色的。
调整后
271
366
190
nil
251
357
402
395
530
443
nil
删除后
271
366
190
nil
251
357
530
402
395
443
nil
删除 z=786
nil
190
251
271
366
357
395
402
443
530
786
(2) 当前结点的兄弟结点是黑色的,而且兄弟结点的两个孩子结点都是黑色的。
上色
172
487
nil
237
632
514
746
删除后
172
487
nil
237
632
514
746
删除 z=62
62
172
237
487
514
632
746
(3) 当前结点的兄弟结点是黑色的,而且兄弟结点的左孩子是红色的,右孩子是黑色的当前结点是父结点的左子树的情况。 当前结点是父结点的右子树的情况这种情况和【当前结点是父结点的左子树的情况】同理。 代码示例
红黑树查找结点
完整示例代码
使用红黑树示例
总结红黑树是一种二叉树,中序遍历绝对有序。当红黑树的性质被破环时,需要触发旋转,进行调整。 红黑数平衡主要是平衡黑高,即任一结点到其子叶子结点的黑色结点数量相同。红黑树的插入和删除会影响红黑树的性质,需要做调整。 后言本专栏知识点是通过<零声教育>的系统学习,进行梳理总结写下文章,对c/c++linux系统提升感兴趣的读者,可以点击链接,详细查看详细的服务:C/C++服务器 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:04:49- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |