本科数据结构课程的漏网之鱼-红黑树(下)

红黑树删除节点的操作与插入操作相比难度大大提高,以至很多博客讲的很不细致,但是为了内容的完整性,还是决定尝试写一下这篇红黑树删除节点的文章。

在正式开始介绍红黑树的删除操作之前,我们先来介绍一下普通的二叉搜索树的删除节点操作。

二叉搜索树删除节点

二叉搜索树删除节点的基本情况有三种:

  • 当待删除节点是叶子节点时,直接删除这个节点即可。
  • 只有一个子节点,用子节点代替待删除节点。
  • 有两个子节点,把左子树中的最大节点或右子树中的最小节点替代待删除节点。

红黑树删除节点

重点来了,由于删除的节点不同,可能会产生很多情况。但由于红黑树本身就是一棵二叉搜索树,因此在调整的过程中还是会遵循一些二叉搜索树的规则的。
以下对红黑树删除节点的内容分步骤进行,共有三步,大家需要耐心看完。

步骤一:待删除节点有两个非空子节点

这种情况下需要转化成待删除节点只有一个孩子或者没有孩子的情况。下图中被框住的节点代表待删除节点,三角形代表任意形态的子树。

在上图中,节点8是待删除的节点,由于它有两个孩子,我们按照普通的二叉搜索树的思路将节点8中序遍历的后一个节点10用来替换这个节点。

现在待删除的节点变成了原来的节点10,下面进行步骤二的操作。

步骤二:待删除节点只有一个非空子节点或两个空节点

  • 情况1:待删除节点是红色,子节点是黑色。这种情况下直接用子节点代替待删除节点就可以。

  • 情况2:待删除节点是黑色,子节点是红色。这种情况先将子节点替换待删除节点,再将子节点变色。

  • 情况3:待删除节点和子节点都是黑色。

显然用子节点代替父节点的话,这条路径上的黑色节点就少了一个,不满足红黑树的性质5(从任一节点出发到每个叶子节点都包含相同数量的黑色节点),这时我们需要进入步骤三。

步骤三:待删除节点和其子节点均为黑色

这一步就比较复杂了,可以分为6种情况,下面我们一一介绍。以下图片均是已经删除节点的图片,可以理解删除的节点是节点12的父节点,节点13(如果存在)的左孩子节点。

  • 情况1:节点12是根节点。这种情况不需要操作,因为在这种情况下没有任何违反红黑树的任何性质。

  • 情况2:节点12的父亲、兄弟、侄子节点都是黑色。在这种情况下,将兄弟节点变成红色,这样从节点13开始到任何叶子节点的黑色节点数都相等了。但是如果节点13不是根节点红黑树又不平衡了,我们让节点13继续扮演之前节点12的角色,递归进行步骤三的操作即可。

  • 情况3:节点12的父亲和侄子节点都是黑色,兄弟节点是红色。首先将节点12和节点13颜色互换,然后节点13进行左旋操作。

看到这里有人会疑惑,这不一样吗?节点12的那条路径上还是差一个黑色节点。别急,这是的情况3转变成了以下三种情况之一了。

  • 情况4:节点12的父亲节点是红色,兄弟、侄子节点是黑色。这种情况较为简单,将兄弟节点和父亲节点都变色即可。

  • 情况5:节点12的父节点颜色随意,兄弟节点15是黑色的右孩子,侄子节点16是红色的右孩子。这种情况需要首先对节点13进行左旋,然后对节点13、节点15颜色互换,节点16变成黑色。

  • 情况6:节点12的父节点颜色随意,兄弟节点是黑色的右孩子,侄子节点分别是红色的左孩子和黑色的右孩子。将节点15进行右旋后节点14变成了节点12的右兄弟节点。接着把节点14和节点15互换颜色,这时眼熟吗?就是上面的情况5,然后按照情况5的方式调整即可。

至此,红黑树删除操作的全部过程就已经介绍完毕了,如果没有看懂的朋友可以结合下面的实战多看几遍。

实战演练

光说不练假把式,接下来我们来一个完整的删除实例操练一下。

这里待删除节点是17,按照步骤一,该节点有两个非空子节点。我们将25复制到17的位置上,现在问题就转化成为删除原来的节点25了,按照步骤二,我们把空节点替换上去。

这时被框起来的部分是不是就是步骤三中的情况6的镜像?我们按照这种情况进行一波操作。

这个时候就变成了步骤三中的情况5,我们继续按照前面说的方式调整。

到这里所有的调整就结束了。红黑树的删除部分很难理解,各位可以把上面的内容多看几遍。

猜你喜欢

转载自blog.csdn.net/qq_32273417/article/details/106974893