红黑树随笔
1. 红黑树是什么?
红黑树本质是一种自平衡二叉查找树,但是他在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则(以下5种)
这些特征使红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为 O(logn)。
2.红黑树的5大规则
- 节点可以是黑色或者红色
- 根节点一定是黑色
- 每个 叶子节点都是黑色的空节点(NIL节点)
- 每个红色节点的左右子节点都必须是黑色
- 从任一节点到其每个叶子节点的路径,都会经历相同的黑色节点
3. 变色和旋转
由于以上的5种规则限制,红黑树的在增、删节点时,需要进行变色和旋转,来适配规则。
3.1 变色
为了重新符合红黑树的规则,尝试把红色节点变为黑色,或者把黑色节点变为红色。
上述动图,就是发生了2次红黑树的变色;流程为:
- 原有的红黑树中插入了一个新的数据40;
- 40和原来的红色节点30 发生了冲突:违背了规则四(每个红色节点的左右子节点都必须是黑色),所以进行一次变色
- 变色后,又违背了规则二(根节点一定是黑色),所以进行了二次变色。
- 经历两次变色后,红黑树变成了符合红黑树的5大规则
3.2 旋转
调整红黑节点结构,转移黑色节点位置,使其在进行插入、删除后仍能保持红黑树的 5 条性质。
上述的动图发生了两次旋转;流程为:
- 对有红黑树插入一个新的 17 节点;
- 17 节点按照流程,插入了18节点的左边子节点;
- 但是由于18是红色节点,为了规则四(红色节点的子节点都必须是黑色),所以执行了一次右旋转;
- 右旋转后:原本作为父节点的 18 ,变成 17 的右节点;但是旋转完成以后,还是不符合规则四;所以继续进行一次左旋转;
- 左旋转后:原本作为父节点的10,变成了17的左节点;
- 此时已经符合红黑树的5项规则。
左旋转
逆时针旋转红黑树的两个节点,使得父节点被自己的右孩子取代,而自己成为左孩子。
如图所示:
一次左旋转后,原本的父节点X变成节点Y的左孩子节点;
由于Y的左孩子节点需要变成新的X,所以原本Y的左孩子 节点B 需要被断开;
X变成Y的左孩子节点后,X的右孩子节点就空出来了;
所以:原本的被断开的B节点,就插入到了X的右孩子节点
右旋转
顺时针旋转红黑树的两个节点,使得父节点被自己的左孩子取代,而自己成为右孩子。
理解了左旋转,再看右旋转,就一个道理了。
如图所示:
一次右旋转后,原本的父节点X变成节点Y的右孩子节点;
由于Y的左孩子节点需要变成新的X,所以原本Y的右孩子 节点C需要被断开;
X变成Y的右孩子节点后,X的左孩子节点就空出来了;
所以:原本的被断开的C节点,就插入到了X的左孩子节点