一、定义:
节点非黑即红
根节点为黑
父子之间不能同时为红
任意节点到叶子节点所经历的黑色节点数目相同
空节点为黑色
操作:
左旋:左边的子节点变成父节点
右旋:右边的子节点变成父节点
插入修复操作分为以下的三种情况,而且新插入的节点的父节点都是红色的:
- 叔叔节点也为红色。
将父节点和叔叔节点与祖父节点的颜色互换,这样就符合了RBTRee的定义。即维持了高度的平衡,修复后颜色也符合RBTree定义的第三条和第四条。下图中,操作完成后祖父节点变成了新的节点。如果祖父节点的父节点不是黑色的话,则继续做修复操作。 - 叔叔节点为空,且祖父节点、父节点和新节点处于一条斜线上。
将子节点进行右旋或者左旋操作,并且和父节点互换颜色。通过该修复操作RBTRee的高度和颜色都符合红黑树的定义。 - 叔叔节点为空,且祖父节点、父节点和新节点不处于一条斜线上。
将子节点进行左旋或者右旋,变成第二种情况
删除修复:只有在删除的节点为黑色时才需要修复
删除修复操作在遇到被删除的节点是红色节点或者到达root节点时,修复操作完毕。
- 待删除的节点的兄弟节点是红色的节点。
由于兄弟节点是红色节点的时候,无法借调黑节点,所以需要将兄弟节点提升到父节点,由于兄弟节点是红色的,根据RBTree的定义,兄弟节点的子节点是黑色的,就可以从它的子节点借调了。
- 待删除的节点的兄弟节点是黑色的节点,且兄弟节点的子节点都是黑色的。
将兄弟节点变成红色,如果父亲节点为红色需将父亲节点设为新节点,调整颜色。 - 待调整的节点的兄弟节点是黑色的节点,且兄弟节点的左子节点是红色的,右节点是黑色的(兄弟节点在右边),如果兄弟节点在左边的话,就是兄弟节点的右子节点是红色的,左节点是黑色的。
旋转兄弟节点的红色子节点,同时换色。按4处理 - 待调整的节点的兄弟节点
旋转兄弟节点。