问题1:红黑树中的黑色节点是怎么出现的,怎么增加的?
- 1.第一个黑色的节点产生于根
- 2.之后的黑色节点来自于case 1, 既新插入的红色节点的parent和uncle都为红
a. parent 为红, uncle为红, 则可以推算出gParent为黑(红色的节点不可能相连)
b. 红色节点插入以后, parent和uncle变为黑色, gParent变为红色
c. gParent变红, 黑色-1; parent变黑, uncle变黑, 黑色+2 ===> 黑色节点的总数+1
d. Summary:
- 变色并不会影响从gParent出发到其所有子树叶节点路径上的黑节点数
- 原来gParent为黑,但是parent和uncle为红;现在gParent为红,parent和uncle为黑,所以黑色的节点数保持不变
- 变色会break红黑树的定义,gParent本来为黑,所以parent(gParent)为红或者黑均可以,但是gParent变红以后, parent(gParent)就只能为黑了,所以可能需要进一步变色或者rotation
问题2:rotation的正确性?
- 答案:正确,且rotation并不会产生rule violation的情况
- 1.rightRotation
ggp ggp a. rightRotation rotation之前ggp的颜色未知, gp的颜色必为黑,因为发生rotation时,p为红,u为黑 | | b. rightRotation rotation过后新的gp为变成黑色的pR gp(B) pR(B) c. 曾经的gp变色为红, uB保持不变 / \ / \ d. 原来ggp - gp - pr - nr上的黑色点数为1 pR uB NR gp(R) ggp - gp - pr - ?0 上的黑色点数为1 + 黑色点数(?0) /\ /\ /\ ggp - gp - ub - ?1 / ?2 上的黑色点数为2 + 黑色点数(?1 / ?2) NR ?0 ?1 ?2 ?0 uB e. 变化过后 ggp - pr - nr 上的黑色点数为1 /\ ggp - pr - gp - ?0上的黑色点数为1 + 黑色点数(?0) ?1 ?2 ggp - pr - ub - ?1 / ?2 上的黑色点数为2 + 黑色点数(?1 / ?2) 由此可知,roatation并没有改变ggp任何子树上的黑色点的个数
- 2.leftRotation/ rightRotation+leftRotation / leftRotation + rightRotation 同理
问题3: 变色会引发后续操做么?rotation会引发后续操做么?
- 答案: 变色会。rotation不会。
- 1.变色后focus从新插入的节点转移到gp,且gp为红。则可能会产生新rule violation,所以有后续操做(同一个位置-gp的颜色被改变了)
- 2.rotation后没有两个相邻的红色点,且ggp各个子树路径上的黑色点的个数并未发生改变,所以不会产生rule violation,则没有后续操做(同一个位置- gp(B)和pR(B) 的颜色其实没有改变)
一个很有用的可视化操作红黑树的网站:https://www.cs.usfca.edu/~galles/visualization/RedBlack.html