参考资料:
何振宇老师上课ppt
Red-Black Tree | Set 2 (Insert)
Red-Black Tree | Set 3 (Delete)插入实现细节注意:
1、要记得维护儿子的父指针,包括当了别人的儿子,或者作为根节点(不是任何一个人的儿子)都要维护。
2、插入节点后,只有违反规则后才需要调整。插入后只能违反两个红节点连续这个规则。
3、case2 和 case 3的parent和new_node相反了,要倒过来。-
插入主要思路:
根据二叉树的插入方式插入x,并将该新节点设置为红色,如果其父亲也是红色,有以下的几种情况一一对应进行处理。而且下面情况只说了在左子树的情况,右子树的情况是对称的。
注意以下情况都是
case 1:叔叔节点为红色,调整A C D的颜色,然后记住C要看作新插入的节点,继续向上。当然向上之前我们可以验证下C跟其父亲是不是都是红色,如果是,需要向上继续,如果不是,可以停下来。
case 2:
叔叔是黑色的,AB不是在同一侧,这种情况下先旋转得到AB在同一侧,如下图所示。然后转变到case3进行进一步处理。上面注意事项第3点说了,A处理之前是父母,B是儿子,但是转换之后,B变到上面去了,B在第三种情况下是父母,所以为了跟case3操作兼容,case2之后,我们要将B变为父母,A变为儿子。
case3:
叔叔是黑色的,AB在同一侧。旋转并变色。
- 删除主要思路
回想BST删除节点的思路,主要是转化为只有一个儿子或者没有儿子的节点的删除,如果有两个儿子,用其前继代替后删除前继,注意前继是符合只有一个儿子或者没有儿子的。红黑树也是BST,所以我们可以用相同的方法先转化为删除只有一个儿子或者没有儿子的节点。如果没有儿子,制造一个NULL虚拟节点,该节点的颜色为黑色。
假设u是要删除的节点,v是其儿子(可能为虚拟)。
simple case:如果u和v有一个是红色的,删除掉u,然后将v涂为黑色。
如果u的兄弟节点s(sibling)为黑色,且s的儿子中有红色的节点。那么用插入时的case 2和case 3的操作进行....