定义:红黑树是一颗二叉查找树,树中结点颜色或为红色或为黑色,且满足如下条件:
⑴根结点和所有外结点的颜色为黑色;
⑵根结点到任意一个外结点的路径上没有连续的两个红色结点,(若一个结点是红色,则其两个儿子结点都是黑色);
⑶根结点到任意外结点的路径上都有相同数目的黑色结点。
1:插入操作
插入操作可以概括为以下几个步骤:
⑴查找要插入的位置,时间复杂度为O(N);
⑵将新结点的颜色赋为红色;
⑶自下而上重新调整该树为红黑树。
其中,第⑵步之所以将新插入的结点颜色赋为红色,是因为:如果设为黑色,就会导致根到外结点的路径上有一条路上多一个额外的黑色结点,这是很难调整的。但是设为红色结点后,可能会导致出现两个连续红色结点的冲突,那么可以通过颜色调换和树旋转来调整。下面讨论第⑶步的细节:
设要插入的结点为N,N的父结点为P,P的父结点为G,P的兄弟结点为U。
①如果P是黑色结点,则整棵树不必调整便是红黑树;
②如果P是红色结点(P的父结点G一定是黑色结点),则插入N后,需要进行调整。调整时有一下三种情况:
⑴N的叔叔结点U是红色结点
如上图所示,将P和U调整为黑色并将G调整为红色。现在新结点N有了一个黑色的父结点P,因为通过P和U的任何路径都必定通过结点G,在这些路径上黑色结点数目没有改变。但是,红色结点G的父结点也有可能是红色的。为了解决这个问题,在结点G上递归调整颜色。
⑵N的叔叔U是黑色结点,并且N是左孩子
如上图所示,对祖父结点G进行一次右旋转;在旋转产生的树中,以前的父结点P现在是新结点N和以前祖父结点G的父结点,然后交换以前父结点P和祖父结点G的颜色。
⑶N的叔叔U是黑色结点,并且N是右孩子
如上图所示,对P进行一次左旋转调整新结点N和父结点P的角色;接着按情况⑵进行处理。