红黑树

一、定义:

节点非黑即红

根节点为黑

父子之间不能同时为红

任意节点到叶子节点所经历的黑色节点数目相同

空节点为黑色

操作:

左旋:左边的子节点变成父节点

右旋:右边的子节点变成父节点

插入修复操作分为以下的三种情况,而且新插入的节点的父节点都是红色的:

  1. 叔叔节点也为红色。
    将父节点和叔叔节点与祖父节点的颜色互换,这样就符合了RBTRee的定义。即维持了高度的平衡,修复后颜色也符合RBTree定义的第三条和第四条。下图中,操作完成后祖父节点变成了新的节点。如果祖父节点的父节点不是黑色的话,则继续做修复操作。
  2. 叔叔节点为空,且祖父节点、父节点和新节点处于一条斜线上。
    将子节点进行右旋或者左旋操作,并且和父节点互换颜色。通过该修复操作RBTRee的高度和颜色都符合红黑树的定义。
  3. 叔叔节点为空,且祖父节点、父节点和新节点不处于一条斜线上。
    将子节点进行左旋或者右旋,变成第二种情况

删除修复:只有在删除的节点为黑色时才需要修复

删除修复操作在遇到被删除的节点是红色节点或者到达root节点时,修复操作完毕。

  1. 待删除的节点的兄弟节点是红色的节点。

    由于兄弟节点是红色节点的时候,无法借调黑节点,所以需要将兄弟节点提升到父节点,由于兄弟节点是红色的,根据RBTree的定义,兄弟节点的子节点是黑色的,就可以从它的子节点借调了。

  2. 待删除的节点的兄弟节点是黑色的节点,且兄弟节点的子节点都是黑色的。
    将兄弟节点变成红色,如果父亲节点为红色需将父亲节点设为新节点,调整颜色。
  3. 待调整的节点的兄弟节点是黑色的节点,且兄弟节点的左子节点是红色的,右节点是黑色的(兄弟节点在右边),如果兄弟节点在左边的话,就是兄弟节点的右子节点是红色的,左节点是黑色的。
    旋转兄弟节点的红色子节点,同时换色。按4处理
  4. 待调整的节点的兄弟节点
    旋转兄弟节点。

你可能感兴趣的:(红黑树)