红黑树小记

143 阅读4分钟

红黑树插入

www.cs.usfca.edu/~galles/vis…

红黑树相较于二叉搜索树多出的几个性质:

  • 节点不是黑就是红
  • 根节点必须为黑节点
  • 根节点到叶子节点的黑色节点数量必须一致
  • 红色节点不能相连接(一个是父节点,一个是子节点)
  • 所有叶子节点都是黑色(null节点)

基于以上条件,可以构造出一个舍弃部分平衡性而换取插入,删除,查询时间复杂度都为log n的数据结构——红黑树。

数据结构是为了更好的组织数据以方便所查询等操作。

接下来一起看看红黑树如何保持相对平衡。

插入操作

首先需要知道的是——红黑树新增节点默认为红色节点,插入操作分为几种情况:

  • 插入新节点,其父节点为红色节点。(破坏条件需要进行平衡)
  • 插入新节点,其父节点为黑色节点。(不破坏条件)

第二我们需要时刻牢记,红黑树是一颗二叉搜索树,二叉搜索树的性质——左节点小于父节点,右节点大于父节点需要牢记。

知道以上两点以后就可以来看红黑树在插入时是如何保持相对平衡的。

网上的文章大多将红黑树的插入分为一下几种情况:

  • 1.插入红色节点,其父节点与叔叔节点(爷爷节点的另一个孩子)均为红色
  • 2.插入红色节点,其父节点为红色,叔叔节点为黑色;这种情况又分为以下几种情况
    • 2.1新增节点为父亲节点的左孩子,父亲节点为爷爷节点的左孩子,即左左
    • 2.2新增节点为父亲节点的右孩子,父亲节点为爷爷节点的左孩子,即左右
    • 2.2新增节点为父亲节点的左孩子,父亲节点为爷爷节点的右孩子,即右左
    • 2.3新增节点为父亲节点的右孩子,父亲节点为爷爷节点的右孩子,即右右

我们也按照上面的步骤来介绍红黑树的这几种插入情况。

1. 红红

红红的情况可以通过仅改变着色的手段来使得达成红黑树的要求。

红黑树最主要控制相对平衡的手段是什么?

是根节点到叶子节点的每条路径的黑色节点数量相同。红色节点不能相连是为了控制平衡度为1/2左右。

对于根节点左子树而言,只要左右两颗子树的路劲黑色节点数量相同就能够满足上面的条件。对于根节点的左子树的左子树而言......递归下去。

请看下面的例子,新增红色节点330,首先不满足两个红色相邻节点,因此最先想到将371着色为黑色。由于节点621也是红色,我们只需要给节点493着色为红色,同时其左右子树均着色为黑色,就可以保持每条路径上的黑色节点数量不变。

插入——红红红.jpg

已插入——轰轰轰.jpg

2. 红黑

红黑情况全部需要通过旋转来达到红黑树的要求。将黑色节点提升一个高度来保证两边路径黑色节点数量相等。

2.1 左左、左右

2.2 右左、右右

网上有很多旋转的图片,大家可以看一下。这里不介绍左旋和右旋是如何操作的。

当新加入一个红色节点,且其父、叔节点颜色不同,此时就需要旋转,提高一个节点的高度来保证一颗只有三个节点的小二叉树里两个叶子节点颜色相等。

为什么偏右要左旋?

因为根据二叉搜索树的性质,右侧的节点全部大于父节点,而左旋的规则能够保证旋转后满足这条要求。

右右.jpg

右右2.jpg

对于右左的情况,为什么右左要多一步自旋的步骤?其实是为了保证二叉搜索树的性质,左大右小。节点22的右边所有都比22大,因此直接左旋会出现250比22大,却是22的右子树的情况,因此需要多一步右旋(保证左旋后满足搜索二叉树的性质,同时不对),然后再左旋。

先旋转满足二叉树搜索树的需求。

右左1.jpg 然后继续左旋即可。

右左2.jpg