红黑树(一)

红黑树基本规则:

 

  1. 根节点与  NULL叶节点   都是黑色节点
  2. 每个红色节点的两个子节点都是黑色节点,换句话说就是不能有连续两个红色节点,但是黑色可以连续
  3. 从  根节点   到所有 NULL叶子节点路径 上的 黑色节点 数量是相同的

红黑树的难点在于插入。

插入的大体步骤:

1.根据 规则3 确定需要插入的子节点的颜色:根据规则3,从根节点到所有NULL叶子节点路径上的黑色节点的数量是一致的,因此可以计算出任意其他路径上的黑色节点的数量,来确定最后插入的颜色(这里未涉及到插入点的位置)

2.分情况进行颜色更改和旋转。

上图中存在以下情况:

1、违反规则2(每个红色节点的两个子节点都是黑色节点,换句话说就是不能有连续两个红色节点),但是在兼顾规则3(根节点到NULL叶子节点路径上的黑色节点的数量相同)的情况下,只能对插入节点X的Parent p以及P的Parent PP进行颜色反转(如果y有子节点还涉及到y的子节点的颜色反转);

2、经过1的颜色反转,会导致图B中的x和P的红色,违反了规则2(每个红色节点的两个子节点都是黑色节点,换句话说就是不能有连续两个红色节点),但是并未违反规则3,需要旋转调整(左旋还是右旋?)

3、左旋还是右旋的确定。如果当前插入的子节点是 某个矛盾节点X 的左子树,那么进行的就应该是右旋;反之,当前插入的节点是矛盾节点的右子树就进行一次左旋。