性质
红黑树的结点都是红色或者黑色
根结点是黑色
所有叶子都是黑色(这里的叶子结点是空结点)
每个红色结点必须有两个黑色的子结点
从任何一个节点到其每个叶子的所有简单路径都包含相同数目的黑色结点
性质1和性质3总是能够保持着;
性质4只有在这些情况下才会发生作用:
增加红色结点
将黑色结点重新绘制成红色结点
旋转
性质5在这些情况下才会发生作用:
增加黑色结点
将红色结点重新绘制黑色结点
旋转
举例:
插入
用BST的方法将结点插入,将该结点标记为红色的(因为如果标记为黑色,则会导致根结点到叶子结点的路径会多出一个黑结点,无法满足性质5,而且不容易进行调整),插入的情况包括下面几种:
插入到一个空的树,插入结点则为根结点,只需要将红色结点重新转染成黑色结点来满足性质2;
新结点的父结点为黑色,满足所有条件;
新结点的父结点为红色,因为性质2和性质4,所以树必然有祖父结点,则又包括以下的情况:
新插入结点为父亲结点的左子结点,那么就构成了一个左左的情况,在之前平衡树中提到过,如果要将其进行平衡,则需要对父结点进行一次单右旋转,形成一个父亲结点为相对根结点,子结点和祖父结点为子结点的树,同时将父亲结点的红色改为黑色,祖父结点更改为红色,这下之前无法满足的性质4和性质5就满足了;
新插入结点为父亲结点的右子结点,那么就会构成一个左右的情况,在之前的平衡树也提到过要进行一次双旋转,先对新结点进行一次单左旋转,变成了左左的结构,再进行一次单右旋转,从而达到满足所有性质;
父亲结点和叔父结点均为红色,显然无法满足性质4,则将父亲结点和叔父结点绘制成黑色,祖父结点设置成红色,但是仍然无法满足情况,比如考虑到祖父结点可能是根结点,则无法满足性质2,或者祖父结点的父结点是红色的,则无法满足性质4,这时需要将祖父结点作为新的结点来看待进行各种情况的判断,涉及到对祖父结点的递归;
父亲结点为红色同时叔父结点为黑色或者从缺,这里又分为