标签:
1)根节点是黑色。
2)所有节点要么是红色,要么是黑色。
3)红节点的孩子必然是黑色。
4)都用叶子节点结尾,且叶子节点是哨兵,都是黑色,没有实际的key值。
5)每一个节点的所有黑高都是相等的,黑高即是从此节点开始,到每一个哨兵所经历的黑节点的个数。
1)插入。与普通二叉查找树没有区别。
2)插入修复。(为了方便,在插入的节点通常都先设为红节点)
case 1:如果插入节点z的父亲p是黑色,那么并不影响红黑色树的任何性质。
case 2:如果插入节点z的父亲p是红色,影响了性质3,这时p的父亲g必然是黑色,那么p的父亲的另外一个孩子u(即是p的叔父节点)的颜色有以下几种情况。
case 2.1:u是红色的,只需要将u,p变成黑色,他们的父亲g变成红色,然后把g赋值给z进行下一轮修复。
case 2.2:u是黑色的,这时看z与p是否都是同侧(即都是左孩子,还是都是右孩子),如果是同侧,可绕g旋转,并且把更改p,g的颜色即可恢复。
case 2.3:u是黑色的,,这时看z与p是否都是同侧(即都是左孩子,还是都是右孩子),如果是异侧,可绕p旋转,并且把z改为旋转后的孩子(即旋转前的父亲),然后变成情况2.2,进行修复。
1)删除。正常删除即可,注意记录删除点的孩子移动行踪x,及其删除点z的原始颜色,如果是红色,不影响红黑树的任何性质,否则要进行删除修复。
2)删除修复。(如果修复过程中根节点变红,最终一定要把他变黑)
case 1:如果x是红色,只需要将变成黑色即可恢复性质。
case 2:如果x是黑色,x的兄弟w是红色,那么x的父亲p是黑色,把他变成黑色,并且绕P旋转就可以转换成x的兄弟是w是黑色即case 3。
case 3:如果x是黑色,x的兄弟w是黑色,如果w的其同侧孩子是黑色,异侧孩子也是黑色,把w变成红色,把x与w的父亲作为新的x进行下一轮修复。
case 4:如果x是黑色,x的兄弟w是黑色,如果w的其同侧孩子是黑色,异侧孩子是红色,绕w旋转可以转换成 case 5;
case 5:如果x是黑色,x的兄弟w是黑色,如果w的其同侧孩子是红色,绕x与w的父亲旋转并且相应的变色即可修复。
标签:
原文地址:http://www.cnblogs.com/ilovewuzhaoxia/p/4323501.html