首页
▼ 算法合集
▼ 加密算法
▼ 凯撒密码
凯撒密码
▼ Hill密码算法
Hill密码算法
▼ 多项式哈希算法
多项式哈希算法
▼ Rail Fence Cipher
Rail Fence Cipher
▼ Graph算法
▼ 关节点
关节点
▼ Bellman-Ford算法
Bellman-Ford算法
▼ 广度优先搜索
广度优先搜索
▼ GraphBridges
桥接模式
▼ 深度优先搜索
深度优先搜索
▼ 检测循环
检测循环
▼ Dijkstra算法
Dijkstra算法
▼ Eulerian Path
欧拉路径
▼ Floyd-Warshall算法
Floyd-Warshall算法
▼ HamiltonianCycle
Hamiltonian Cycle
▼ Kruskal算法
Kruskal算法
▼ Prim算法
Prim算法
▼ 强连通分量
强连通分量
▼ 拓扑排序
拓扑排序
▼ Travelling Salesman Problem
Travelling Salesman
▼ 图像处理算法
▼ Seam Carving算法
内容感知缩放算法
▼ 链表
▼ 反向遍历
反向遍历
▼ GraphTraversal
GraphTraversal
▼ 数学算法
▼ 二进制浮点数
BinaryFloatingPoint
▼ 位操作
位操作算法
▼ 复数
复数
▼ 欧几里得算法
Euclidean Algorithm
▼ Euclidean Distance
欧几里得距离
▼ 阶乘算法
阶乘算法
▼ 快速幂算法
快速幂算法
▼ Fibonacci数列
斐波那契数列
▼ 傅里叶变换
Fourier变换
▼ Horner法
霍纳法则
▼ 整数划分
整数划分
▼ 判断是否为2的幂
判断是否为2的幂
▼ 最小公倍数
最小公倍数
▼ Liu Hui
Liu Hui
▼ 矩阵
Matrix
▼ Pascal三角形
Pascal三角形
▼ Primality Test
素数测试
▼ 质因数
质因数
▼ 弧度计算
弧度计算
▼ 埃拉托色尼筛法
埃拉托色尼筛法
▼ SquareRoot
SquareRoot
▼ MachineLearning
▼ K均值算法
K均值算法
▼ K近邻算法
K近邻算法
▼ 搜索算法
▼ 二分查找算法
二分查找
▼ 插值搜索算法
插值搜索算法
▼ 跳跃搜索算法
跳跃搜索算法
▼ 线性搜索
线性搜索算法
▼ 集合
▼ 笛卡尔积
笛卡尔积
▼ 组合总和
组合总和
▼ 组合算法
组合算法
▼ Fisher-Yates洗牌算法
Fisher-Yates洗牌算法
▼ 背包问题
背包问题
▼ 最长公共子序列
最长公共子序列
▼ 最长递增子序列
最长递增子序列
▼ 最大子数组
最大子数组
▼ 排列组合
排列组合
▼ 幂集
幂集算法
▼ 最短公共超序列
最短公共超序列
▼ Sorting Algorithms
▼ 冒泡排序
冒泡排序
▼ 桶排序算法
桶排序算法
▼ 计数排序算法
计数排序
▼ 堆排序算法
堆排序
▼ 插入排序
插入排序
▼ 归并排序
归并排序
▼ 快速排序算法
快速排序算法
▼ 基数排序
基数排序
▼ 选择排序算法
选择排序算法
▼ 希尔排序
希尔排序
▼ 统计学
▼ 加权随机
加权随机算法
▼ 字符串算法
▼ Hamming距离
Hamming距离
▼ KnuthMorrisPratt算法
Knuth-Morris-Pratt算法
▼ LevenshteinDistance
Levenshtein距离
▼ 最长公共子串
最长公共子串
▼ 回文检测算法
回文检测算法
▼ Rabin-Karp算法
Rabin-Karp算法
▼ 正则表达式匹配
正则表达式匹配
▼ Z算法
Z算法
▼ Tree Data Structure
▼ 广度优先搜索
广度优先搜索
▼ 深度优先搜索
深度优先搜索
▼ 未分类
▼ 最佳买卖股票时机
最佳买卖股票时机
▼ 汉诺塔算法
HanoiTower
▼ 跳跃游戏算法
跳跃游戏
▼ KnightTour
骑士巡逻
▼ N皇后问题
N皇后问题
▼ 雨水收集
雨水收集
▼ 递归楼梯问题
递归楼梯问题
▼ 方阵旋转
方阵旋转
▼ 独特路径
UniquePaths
▼ 数据结构
▼ BloomFilter算法
布隆过滤器
▼ 不相交集数据结构
Disjoint Set
▼ 双向链表
双向链表
▼ Graph
Graph算法
▼ 哈希表
哈希表
▼ Heap数据结构
Heap数据结构
▼ 链表
链表
▼ LRU缓存
LRU缓存
▼ 优先队列
优先队列
▼ 队列
队列
▼ 栈结构
栈结构
▼ Tree Data Structure
树结构
▼ AVL树
AVL树
▼ 二叉搜索树
二叉搜索树
▼ Fenwick树
Fenwick树
▼ 红黑树
红黑树
▼ 线段树
SegmentTree
▼ Trie数据结构
Trie数据结构
红黑树
在其他语言中阅读:
葡萄牙语
红黑树 是一种自平衡的二叉搜索树,在计算机科学中。二叉树的每个节点都有一个额外的位,这个位通常被解释为节点的颜色(红色或黑色)。这些颜色位用于确保在插入和删除过程中树保持大致平衡。
通过以某种满足一定属性的方式给树的每个节点涂上两种颜色来保持平衡,这些属性共同限制了树在最坏情况下可以变得多不平衡。当树被修改时,新树随后会被重新排列和重新着色以恢复涂色属性。这些属性被设计得如此高效,以至于这种重新排列和重新着色可以被有效地执行。
树的平衡并不是完美的,但足够好,允许它保证在O(log n)
时间内进行搜索,其中n
是树中元素的总数。插入、删除操作以及树的重新排列和重新着色也都在O(log n)
时间内完成。
红黑树的一个例子:

属性
除了对二叉搜索树所施加的要求外,红黑树还必须满足以下条件:
- 每个节点要么是红色,要么是黑色。
- 根节点是黑色。这个规则有时会被省略。由于根节点总是可以从红色变为黑色,但不一定能从黑色变为红色,所以这个规则对分析的影响很小。
- 所有叶子(NIL)都是黑色的。
- 如果一个节点是红色的,那么它的两个子节点都是黑色的。
- 从给定节点到其所有子孙NIL节点的路径包含相同数量的黑色节点。
一些定义:从根节点到节点的黑节点数量是节点的黑深度;从根节点到叶子节点的所有路径中的黑节点均匀数量称为红黑树的黑高度。
这些约束强制红黑树具有一个关键属性:从根节点到最远叶子的路径长度不会超过从根节点到最近叶子节点路径长度的两倍。结果是树大致上是高度平衡的。由于插入、删除和查找值等操作的时间与树的高度成比例,这种理论上的最大高度上限允许红黑树在最坏情况下也是高效的,不同于普通的二叉搜索树。
插入时的平衡
如果叔叔是红色的

如果叔叔是黑色的
- 左左情况(
p
是g
的左孩子,x
是p
的左孩子)
- 左右情况(
p
是g
的左孩子,x
是p
的右孩子)
- 右右情况(
p
是g
的右孩子,x
是p
的右孩子)
- 右左情况(
p
是g
的右孩子,x
是p
的左孩子)
左左情况(见g,p和x)

左右情况(见g,p和x)

右右情况(见g,p和x)

右左情况(见g,p和x)

参考资料