| |
|
开发:
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++ 二叉搜索树(五)红黑树的实现(1)定义与插入操作 -> 正文阅读 |
|
[C++知识库]C++ 二叉搜索树(五)红黑树的实现(1)定义与插入操作 |
本篇和下一篇实现红黑树。 由于红黑树比较复杂,本篇仅说明其基本定义以及插入操作的实现,将删除操作放在下一篇。 希望你已经学过了这些知识:
动机:
删除操作后的重平衡次数多达
O
(
l
o
g
n
)
O(logn)
O(logn),花费时间太长,而红黑树保证在插入和删除后的重平衡次数为
O
(
1
)
O(1)
O(1)。 基本概念外部节点:外部节点为虚拟的 在后面的实现中外部节点都用这样的红点圆形表示。 红、黑节点:在普通二叉搜索树的基础上,红黑树的节点被染为红色或黑色。 黑深度:从根到节点 黑高度:从节点 红黑树的限制条件:
上面的限制条件让人一头雾水,下面借助 红黑树是4阶B树一个红黑树例子:
可以换个角度看这个红黑树,将红黑树中的红节点摆放到其祖先中最低的黑节点的同一高度处,然后将同一层中有连接的红节点和黑节点看成一个大的节点: 满足限制条件的红黑树中,一个黑节点至多有 在对应的
含有与上面 代码实现红黑树的实现基于第一篇中的基本二叉搜索树 API宏提供简单功能的一些宏:
Node节点类与第一篇中的基本一致,仅修改了如下内容:
下面仅列出了与本篇相关的内容:
函数的具体实现不在这里重复贴出了。 RBTree继承了之前的
说明:
更新黑高度
插入操作与双红现象insert插入操作很简单,先用 注意:除根节点外创建的新节点默认为红节点,因为这样的话,红黑树的限制条件中只有 “红节点的子必为黑节点” 这一条可能不满足。 主方法:
在插入数据后使用 双红现象及修正设新插入节点为 如果 注意:既然插入前的红黑树合法,那么 1. 叔叔节点u为黑节点此类情况的一种可能(根据v、p、g的左右位置共4种可能)如下图所示: 为了方便理解如何修改,我们可以采用迂回的方法,先将上面的红黑树用
将上图大节点转换回红黑树: 新的红黑树也是满足限制条件的,调整完成。 至此,我们可以说,只需将一开始的红黑树转换成上图的红黑树,红黑树就恢复正确了,至于转换的方法,正是
2. 叔叔节点u为红节点此类情况的一种可能(根据v、p、g的左右位置共4种)如下图所示: 将上图红黑树转为 显然大节点发生了上溢(超过了 此时 恢复至红黑树: 与一开始比较,仅仅是 要注意的是,下面这个节点 可能是这种情况: 在该层可能会再次发生双红现象,因此需要递归的不断向上处理至多
从上面可以看出,插入操作后的平衡至多进行一轮旋转。 |
|
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图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 10:12:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |