红黑树的两个性质:
1. 从根出发到任意空节点的路径黑节点数量均相同。
2. 红节点的子节点为黑(这意味着红节点的父节点也为黑)。
左偏红黑树就是再增加一条新性质:
3. 黑节点的右孩子也不为红。
由于插入的是红节点,于是只有性质23可能被打破。开始将当前节点指向新节点,然后递归向上维护,在整个递归维护过程中,会保持整个树的性质与刚插入时一样:即除了当前节点与其父节点可能会违反性质23以外整颗树都是合法的(当前节点如果没有父节点直接退出递归)。
当前节点的父节点为根节点时情况很简单,这里不赘述。
当前节点的父节点不为根节点时,可能的情况有三种:
① 只违反性质3,左旋一次,再翻转两次颜色,这样ABC的黑深度保持不变,此时已经可以结束递归。
② 只违反性质2,右旋一次,再翻转一次颜色,这样ABCD的黑深度保持不变,但顶上那个节点的颜色变了,将当前节点指向最后方框里的那个节点继续递归。
③ 同时违反性质23,先左旋再右旋,再翻转一次颜色,这样ABCD的黑深度保持不变,同②一样将当前节点指向最后方框里的那个节点继续递归。
当然,如果性质23均不违反,也可以直接退出递归。