在二叉查找树(BST)的基础上,节点额外维护一个颜色(红或黑)信息(空节点颜色为黑,可以建一个0节点,则新节点初始化时便自动指向0节点),满足以下两个性质:
1. 红节点的子节点为黑(这意味着红节点的父节点也为黑)。
2. 从根出发到任意空节点的路径黑节点数量均相同。
则是一颗红黑树。
新插入的节点颜色为红色,此时性质2保持只有性质1可能被打破,将当前节点指向新插入的节点,按以下6种情况递归维护:
1. 当前节点为根节点,结束递归。
2. 当前节点的父节点为黑,性质1也没问题,结束递归。
3. 当前节点的父节点为红且父节点为根节点,将父节点涂黑(所有路径黑节点数量+1不破坏性质2),结束递归。
4. 当前节点N的父节点为红且叔节点为红,如下图(借用oi wiki):
此时将P、U涂黑,将G涂红,然后将当前节点指向G,继续下一轮判断。
5. 当前节点N的父节点P为红且叔节点为黑且N和P为同侧节点,此时G必为黑节点,这里只说均为左侧的情况,右侧同理:先右旋G,再将P涂黑将G涂红,此时同时满足性质1和2(子树根节点的颜色依旧为黑,节点插入前的红黑树是合法的),结束递归。
6. 当前节点N的父节点P为红且叔节点为黑且N和P为异侧节点,同样只说一种对称的情况:如下图,N为P的右儿子,P为G的左儿子,将P左旋一下,将当前节点指向P,则完全变成了第5种情况,按先前的方式处理即可。