红黑树学习笔记(2)-插入操作

1 插入操作的第一步是将插入节点按照二叉查找树的规则插入到合适的位置,然后将插入节点置为红色。如下图所示,插入的节点为蓝色的4.

2 设插入的节点为$z$。如果之前是空树,那么直接将$z$置为黑色即可。下面的情况假设之前不是空树。那么插入之后,如果$z$的父节点的颜色为黑色,则本次插入直接结束,因为插入操作没有破坏树的所有性质。如果$z$的父节点的颜色为红色,那么破坏了性质(4)(但是没有破坏性质(5)),即红色节点的孩子不能是红色的。下面是这种情况下的调整方法。先假设$z$的父节点是$z$爷爷节点的左孩子(另外一种情况即$z$的父节点是$z$爷爷节点的右孩子跟这种情完全类似)。同时设$y$是$z$父节点的兄弟节点。在这些前提下分两种情况:

(1)$y$的颜色是红色:如下如左侧所示,这时候$z$的爷爷节点的颜色一定是黑色,因为$z$的父节点和叔叔节点都是红色,那么直接将父节点和叔叔节点$y$置为黑色,将爷爷节点置为红色,然后令$z=z的爷爷节点$,继续调整$z$。注意,这里的任何时候性质(5)没有被破坏。

(2)$y$的颜色是黑色:这种情况下又分两种情况:

   i $z$是其父节点的右孩子:这时候,令$z=z的父节点$,然后进行左旋,此时这种情况转换成了情况ii。如下图所示:

   ii $z$是其父节点的左孩子:这时候$z$的父节点是红色,$z$的爷爷节点是黑色(因为$z$的父节点是红色),现将$z$的父节点置为黑色,$z$的爷爷节点置为红色,到这一步破坏了性质(5),因为到节点$D$下面的叶子节点的路径上黑色节点减少了1(原来$CD$都是黑色,现在$C$变成红色),所以这时候右旋$z$的爷爷节点,即可使得性质(5)不被破坏,而且这一步之后性质(4)也没有被破坏了。这个过程如下图所示:

原文地址:https://www.cnblogs.com/jianglangcaijin/p/6011524.html