看了很多材料,关于红黑树的删除,大概所有的总结都大同小异,今天先聊聊对红黑树删除的情况分析:
红黑树的删除操作
1:节点命名约定
D表示要被删除的节点。即:取 Delete 的首字母;
P 表示父节点。即:取 Parent 的首字母;
S表示兄弟姐妹节点。即:取 Sibling的首字母;
U表示叔伯节点。即:取Uncle的首字母;
G表示祖父节点。即:取 Grandfather的首字母;
L表示左树。即:取Left的首字母;
R表示右树。即:取Right的首字母;
Nil表示叶子节点。即所谓的空节点;注意:红黑树中的叶子节点与其他树中所述说的叶子节点不是同一概念。而且红黑树中的叶子节点(即:Nil节点)永远是被定义为黑色的。
下文的节点命名表示将会使用以上这些命名约定或它们的组合表示。因此,请先牢记这些命名约定。举例:
DR表示要被删除的节点的右子树,即:右子节点;
SL表示兄弟节点的左子树,即:左子节点;
…
2:删除操作宏观分析
在红黑树中,删除一个节点往大的说,只有以下四种情况。
情况一:删除的节点的左、右子树都非空;
情况二:删除的节点的左子树为空树,右子树非空;
情况三:删除的节点的右子树为空树,左子树非空;
情况四:删除的节点的左、右子树都为空树;
其中情况一,可以按与其他二叉搜索树的删除方式一样处理,最终可以转换到后面的三种情况。具体为:找到(Old)D节点的直接后继节点(暂且称为X节点),然后将X的值转移到D节点,最后将X节点作为真正要被删除掉的节点(即:(Real)D节点)。这样删除操作后,可以保证该树仍然为一棵二叉搜索树。但由于红黑树的定义(即:红黑树的性质)约定。这样删除(Real)D节点后,可能会破坏红黑树的性质。所以需要额外做一些调整处理,这便是下面将要详细讨论的内容。
说明:下文中所提到的D,除非有特别说明,否则都将指的是(Real)D。
3:红黑树删除后平衡处理
在具体分析之前,再次列出红黑树的定义:
1) 任何一个节点非红即黑;
2) 树的根为黑色;
3) 叶子节点为黑色(注意:红黑树的所有叶子节点都指的是Nil节点);
4) 任何两个父子节点不可能同时为红色