红黑树:二叉查找树+平衡二叉树(大致平衡的)
核心性质:从根节点到任意叶子节点最长的路径不大于最短路径的二倍。
在插入和删除操作中核心性质可能不再满足,所以在插入删除中要进行判断是否满足,但是直接判断是否满足核心性质麻烦,就用了五条容易判断的性质进行等价替换。
五条性质:
1.根节点是黑色的。
2.节点非黑即红。
3.不每条路径上不能有连续两个红色节点。
4.从任意节点到叶子节点黑节点数量相同。
5.叶子节点都是黑色的。
为了算法的描述方便设置每个叶子节点都是黑色哨兵节点。
插入过程(五条):默认插入的节点是红色节点,要是默认是黑色的会很麻烦(由于性质4)。
1.如果插入节点的父节点不存在就将颜色改为黑色。(因为这个节点就是根节点)
void case1(node){
if(node.parent==NULL){
node.color = black;
}else {
case2(node)
}
}
****插入过程的五条判断实际上都是五个函数,并且内部都是一个if-else判断,在if中判断,else中调用下一个函数。形式都是上边这种
2.如果插入的节点的父节点是黑色,则ok,zhijiereturn。
3.如果插入的节点的父亲节点和叔叔节点是红色,则变化父叔节点为黑色,再把祖父节点变为红色,然后将祖父节点作为node,从case1开始判断。
4.
(1)父节点P是红色而叔父节点U是黑色或缺少,并且新节点N是其父节点P的右子节点而父节点P又是其父节点的左子节点。
则父进行左旋,然后执行case5.
(2)父节点P是红色而叔父节点U是黑色或缺少,并且新节点N是其父节点P的左子节点而父节点P又是其父节点的右子节点。
则父进行右旋,然后执行case5.
5.父变黑,祖父变红
(1)父节点P是红色而叔父节点U是黑色或缺少,并且新节点N是其父节点P的右子节点而父节点P又是其父节点的右子节点。
则祖父进行左旋
(2)父节点P是红色而叔父节点U是黑色或缺少,并且新节点N是其父节点P的左子节点而父节点P又是其父节点的左子节点。
则祖父进行右旋
左旋就是:逆时针
右旋就是:顺时针
删除操作六条:形式也是六个函数,if-else格式的。
1.删除的是根,直接删。
2.