红黑树和B+树一看就懂


红黑树:二叉查找树+平衡二叉树(大致平衡的)

核心性质:从根节点到任意叶子节点最长的路径不大于最短路径的二倍。

在插入和删除操作中核心性质可能不再满足,所以在插入删除中要进行判断是否满足,但是直接判断是否满足核心性质麻烦,就用了五条容易判断的性质进行等价替换。

五条性质:

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.

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM