红黑树
红黑树
AVL 树是平衡的二叉搜索树,在插入和删除元素时通过旋转保持树的平衡
红黑是也是平衡的二叉搜索树,和 AVL 树的只要区别是判断失衡的标准不一样
AVL 是根据左右子树的高度差来判断是否失衡,旋转后是严格平衡的
红黑树是根据自己的方式来判断是否失衡,也会旋转,但是旋转次数要少些
核心特性
- 所有节点都有两种颜色,红与黑
- 根节点是黑色
- NIL 节点为黑色(叶子结点没有左右子节点,这两个不存在的节点就是 nil 节点;未填满的节点一样处理)
- 红色节点的子节点为黑色(或者说红色节点不能相邻,如果相邻了就表示失衡,需要进行调整)
- 从根节点到每个子节点( NIL 节点)的每条路径上的黑色节点数量相同
1、2、3 没什么好说的,如果 4、5 不满足就说明失衡(AVL 是根据左右子树高度来判断是否失衡)
判断失衡节点
- 颜色冲突:新插入的红色节点导致父子节点均为红色(违反性质4)。
- 黑高破坏:删除黑色节点后,某些路径的黑节点数减少(违反性质5)
修复失衡节点
插入节点时修复
| 情况 | 条件 | 操作 |
|---|---|---|
| Case1 | 叔节点为红 | 父、叔变黑,祖父变红 |
| Case2 | 叔节点为黑且当前为右子节点 | 左旋父节点转为Case3 |
| Case3 | 叔节点为黑且当前为左子节点 | 父变黑、祖父变红,右旋祖父 |
删除节点时修复
| 情况 | 条件 | 操作 | 目的 |
|---|---|---|---|
| Case1 | 兄弟节点为红 | 兄弟变黑,父变红,左旋父 | 转为兄弟为黑的情况 |
| Case2 | 兄弟的子节点均为黑 | 兄弟变红,当前节点上移 | 将问题向上传递 |
| Case3 | 兄弟的右子为黑 | 兄弟左子变黑,兄弟变红后右旋 | 转为Case4 |
| Case4 | 兄弟的右子为红 | 兄弟继承父色,父和兄弟右子变黑后左旋 | 直接修复黑高 |
AVL VS 红黑树
| 特性 | AVL树 | 红黑树 |
|---|---|---|
| 失衡判断依据 | 左右子树高度差 > 1 | 双红冲突或黑高不一致 |
| 修复手段 | 单旋或双旋 | 变色 + 旋转(最多3次) |
| 插入旋转次数 | 最多O(1)次 | 最多2次 |
| 删除旋转次数 | 可能O(log n)次 | 最多3次 |
| 插入时间复杂度 | O(log n) | O(log n) |
| 删除时间复杂度 | O(log n) | O(log n) |
| 查找时间复杂度(理论) | O(log n) | O(log n) |
| 查找时间复杂度(实际) | 更高(严格的平衡树) | 稍低(近似的平衡树) |
红黑树因为近似的平衡二叉树,查询效率已经很高了,只不过 AVL 更高
但是插入和删除操作红黑树因为不用保证严格的平衡所以通常只需要常数级的复杂度
总的来看如果明确了查询多就用 AVL,如果 遇事不决就红黑树 吧

浙公网安备 33010602011771号