红黑树(RBT)的定义:它或者是一颗空树,或者是具有一下性质的二叉查找树:
1.节点非红即黑。
2.根节点是黑色。
3.所有NULL结点称为叶子节点,且认为颜色为黑。
4.所有红节点的子节点都为黑色。
5.从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。
插入操作
由于性质的约束:插入点不能为黑节点,应插入红节点。因为你插入黑节点将破坏性质5,所以每次插入的点都是红结点,但是若他的父节点也为红,那岂不是破坏了性质4?对啊,所以要做一些“旋转”和一些节点的变色!另为叙述方便我们给要插入的节点标为N(红色),父节点为P,祖父节点为G,叔节点为U。下边将一一列出所有插入时遇到的情况:
首先将插入点颜色设置为红色,
情形1:该树为空树,直接插入根结点的位置,违反性质1,把节点颜色有红改为黑即可。
情形2:插入节点N的父节点P为黑色,不违反任何性质,无需做任何修改。
情形3:P为红,P为G的左节点:
A、U为红,U,P变为黑,G变为红,此时以G为根的子树少了一个黑节点,将G看作插入点像上检查。
B、U为黑或U没有:i、N为P的左节点(左左插入),P变为黑,G变为红,单向右旋转
ii、N为P的右节点(左右插入,先左旋转,然后按i作单向右旋转
情形4:P为红,P为G的右节点:
A、U为红,U,P变为黑,G变为红,此时以G为根的子树少了一个黑节点,将G看作插入点像上检查。
B、U为黑或U没有:i、N为P的右节点(右右) ,P变为黑,G变为红,单向左旋转
ii、N为P的左节点(右左),先右旋转,然后按i作单向左旋转