红黑树的特点
- 每个节点不是黑色就是红色
- 根节点为黑色
- 每个叶子节点(NIL)为黑色
- 每个红色节点的两个子节点一定都是黑色
- 任意节点到每个叶子节点的路径都包含数量相同的黑节点
==>如果一个结点存在黑子节点,那么该结点肯定有两个子节点 - 最长路径不超过最短路径的2倍
红黑树的变换
变色
由红色变为黑色,由黑色变为红色
左旋
- 旋转节点的右子节点变为旋转节点的父节点
- 旋转节点的右子节点的左子节点变为旋转节点的右子节点
- 旋转节点的右子节点的右子节点保持不动
- 旋转节点的左子节点保持不动
动图演示下:
右旋
- 旋转节点的左子节点变为旋转节点的父节点
- 旋转节点的左子节点的右子节点变为旋转节点的左子节点
- 旋转节点的右子节点保持不动
- 旋转节点的左子节点的左子节点保持不动
动图演示下:
红黑树的插入
首先来确定下插入的种类
1.树为空
直接插入为跟节点,颜色变为黑色
2.插入节点的key在树中存在
树本事结构已经稳定无需更改,把插入节点中的值与key值替换
3.插入节点的父节点为黑色
插入节点为红色,插入到父节点为黑色的子树下不会影响红黑树的平衡
4.插入节点的父节点为红色
考虑父节点的兄弟节点是否为红色会出现两种情况,插入节点的叔叔节点为红色或为黑色。当然也会出现NIL情况,这种情况与黑色一起考虑。
此时就会出现违背红黑树的特点的现象,红红,违背了“每个红节点的两个子节点都是黑色”的原则。
4.1插入节点的叔叔为红色
P变成黑色
S变成黑色
祖父PP变成红色
把PP设置为插入节点再次平衡红黑树(PP节点的父节点为红色时)
4.2插入节点的叔叔节点为黑色
4.2.1插入节点的父节点是祖父节点的左子节点
- 插入节点为其父节点的左节点
- PP变成成红色
- P变成黑色
- 对PP进行右旋
- 插入节点为其父节点的右节点
- P进行左旋
- PP变成红色
- P变成黑色
- 对PP进行右旋
4.2.2插入节点的父节点是祖父节点的右子节点
- 插入节点为其父节点的右节点
- PP变成红色
- P变成黑色
- PP进行左旋
- 插入节点为其父节点的左节点
- 先对P进行一次右旋
- PP变成红色
- P变成黑色
- 对PP进行一次左旋