红黑树的具象理解(动图+图解)

红黑树的特点

  • 每个节点不是黑色就是红色
  • 根节点为黑色
  • 每个叶子节点(NIL)为黑色
  • 每个红色节点的两个子节点一定都是黑色
  • 任意节点到每个叶子节点的路径都包含数量相同的黑节点
    ==>如果一个结点存在黑子节点,那么该结点肯定有两个子节点
  • 最长路径不超过最短路径的2倍

红黑树的变换

变色

由红色变为黑色,由黑色变为红色

左旋

  1. 旋转节点的右子节点变为旋转节点的父节点
  2. 旋转节点的右子节点的左子节点变为旋转节点的右子节点
  3. 旋转节点的右子节点的右子节点保持不动
  4. 旋转节点的左子节点保持不动

动图演示下:
在这里插入图片描述

右旋

  1. 旋转节点的左子节点变为旋转节点的父节点
  2. 旋转节点的左子节点的右子节点变为旋转节点的左子节点
  3. 旋转节点的右子节点保持不动
  4. 旋转节点的左子节点的左子节点保持不动

动图演示下:
在这里插入图片描述

红黑树的插入

首先来确定下插入的种类
在这里插入图片描述

1.树为空

直接插入为跟节点,颜色变为黑色

2.插入节点的key在树中存在

树本事结构已经稳定无需更改,把插入节点中的值与key值替换

3.插入节点的父节点为黑色

插入节点为红色,插入到父节点为黑色的子树下不会影响红黑树的平衡

4.插入节点的父节点为红色

考虑父节点的兄弟节点是否为红色会出现两种情况,插入节点的叔叔节点为红色或为黑色。当然也会出现NIL情况,这种情况与黑色一起考虑。

此时就会出现违背红黑树的特点的现象,红红,违背了“每个红节点的两个子节点都是黑色”的原则。

4.1插入节点的叔叔为红色

P变成黑色
S变成黑色
祖父PP变成红色
把PP设置为插入节点再次平衡红黑树(PP节点的父节点为红色时)
在这里插入图片描述

4.2插入节点的叔叔节点为黑色

4.2.1插入节点的父节点是祖父节点的左子节点

  1. 插入节点为其父节点的左节点
  • PP变成成红色
  • P变成黑色
  • 对PP进行右旋
    在这里插入图片描述
  1. 插入节点为其父节点的右节点
  • P进行左旋
  • PP变成红色
  • P变成黑色
  • 对PP进行右旋
    在这里插入图片描述

4.2.2插入节点的父节点是祖父节点的右子节点

  1. 插入节点为其父节点的右节点
  • PP变成红色
  • P变成黑色
  • PP进行左旋
    在这里插入图片描述
  1. 插入节点为其父节点的左节点
  • 先对P进行一次右旋
  • PP变成红色
  • P变成黑色
  • 对PP进行一次左旋

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42119415/article/details/108131429