通过上一篇红黑树建树过程图解,相信大家对建树的过程有一个感性的认识,这一篇文章主要是针对上一篇所提到的序列已建成的树进行一步一步的删除操作,同样在感性的认识对红黑树的删除结点的过程。
首先还是从红黑树的性质开始:
红黑树除了具有二叉搜索树的所有性质之外,还具有以下5种性质:
1. 每个节点是黑色或是红色;
2. 根节点为黑色;
3. 空节点是黑色的(包括根节点的parent以及所有叶节点left、right都为NULL);
4. 红色节点的父、左子、右子节点都是黑色;
5. 在任何一棵子树中,每一条从根节点向下走到空节点的路径上包含的黑色节点数量都相同。
删除的节点的方法与常规二叉搜索树中删除节点的方法是一样的,如果被删除的节点不是有双非空子女,则直接删除这个节点,用它的唯一子节点顶替它的位置,如果它的子节点分是空节点,那就用空节点顶替它的位置,如果它的双子全为非空,就把它的直接后继节点内容复制到它的位置,之后以同样的方式删除它的后继节点,它的后继节点不可能是双子非空,因此此传递过程最多只进行一次。
在册除节点后,原红黑树的性质可能被改变:
1.如果删除的是红色节点,那么原红黑树的性质依旧保持,此时不用做修正操作;
2.如果删除的节点是黑色节点,原红黑树的性质可能会被改变,要对其做修正操作:
a)如果删除节点不是树唯一节点,那么删除节点的那一个支的到各叶节点的黑色节点数会发生变化,此时性质5被破坏;
b)如果被删节点的唯物主唯一非空子节点是红色,而被删节点的父节点也是红色,那么性质4被破坏;
c)如果被删节点是根节点,而它的唯一非空子节点是红色,则删除后新根节点将变成红色,违背性质2。
图中用方框标识的表示下一个将要被删除的结点,其中有的结点经过几次变换而得到下一步的图,中间过程我已经省略,如果各位读者感兴趣的话,可以画出中间变化过程,达到熟练掌握红黑树删除的变化过程。