图解红黑树

一.红黑树的五条规则

 红黑树除了符合二叉搜索树的基本规则外,还添加了以下特性:

  • 规则1:节点是红色或黑色的;
  • 规则2:根节点是黑色的;
  • 规则3:每个叶子节点都是黑色的空节点(NIL节点);
  • 规则4:每个红色节点的两个子节点都是黑色的(从每个叶子到根的所有路径上不可能有两个连续的红色节点);
  • 规则5:从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点;

 

 红黑树的相对平衡

前面5条规则的约束确保了以下红黑树的关键特性:

  • 根到叶子节点最长路径,不会超过最短路径两倍
  • 结果就是这棵树基本是平衡的;
  • 虽然没有做到绝对的平衡,但是可以保证在最坏的情况下,该树依然是高效的;

为什么可以做到最长路径不超过最短路径的两倍呢?

  • 性质4决定了路径上不能有两个相连的红色节点;
  • 所以,最长路径一定是红色节点和黑色节点交替而成的;
  • 由于根节点和叶子节点都是黑色的,最短路径可能都是黑色节点,并且最长路径中一定是黑色节点多于红色节点;
  • 性质5决定了所有路径上都有相同数目的黑色节点;
  • 这就表明了没有路径能多于其他任何路径两倍长。

二.红黑树的三种变换 

插入一个新节点时,有可能树不再平衡,可以通过三种方式的变换使树保持平衡:

  •  变色
  • 左旋转
  • 右旋转

 2.1变色

为了重新符合红黑树的规则,需要把红色节点变为黑色,或者把黑色节点变为红色

插入的新节点通常都是红色节点

  • 当插入的节点为红色的时候,大多数情况不违反红黑树的任何规则;

  • 插入黑色节点,必然会导致一条路径上多了一个黑色节点,这是很难调整的;

  • 红色节点虽然可能导致红红相连的情况,但是这种情况可以通过颜色调换和旋转来调整;

2.2.左旋转

 以节点X为根逆时针旋转二叉搜索树,使得父节点原来的位置被自己的右子节点替代,左子节点的位置被父节点替代;

 

 详解:

如上图所示,左旋转之后:

  • 节点X取代了节点a原来的位置;
  • 节点Y取代了节点X原来的位置;
  • 节点X的左子树 a 仍然是节点X的左子树(这里X的左子树只有一个节点,有多个节点时同样适用,以下同理);
  • 节点Y的右子树 c 仍然是节点Y的右子树
  • 节点Y的左子树 b 向左平移成为了节点X的右子树

除此之外,二叉搜索树左旋转之后仍为二叉搜索树

 

 

 2.3.右旋转

 以节点X为根顺时针旋转二叉搜索树,使得父节点原来的位置被自己的左子节点替代,右子节点的位置被父节点替代

 

 详解:

如上图所示,右旋转之后:

  • 节点X取代了节点a原来的位置;
  • 节点Y取代了节点X原来的位置;
  • 节点X的右子树 a 仍然是节点X的右子树(这里X的右子树虽然只有一个节点,但是多个节点时同样适用,以下同理);
  • 节点Y的左子树 b 仍然是节点Y的左子树
  • 节点Y的右子树 c 向右平移成为了节点X的左子树

除此之外,二叉搜索树右旋转之后仍为二叉搜索树:

 

 

 三.红黑树的插入操作

首先需要明确,在保证满足红黑树5条规则的情况下,新插入的节点必然是红色节点

为了方便说明,规定以下四个节点:新插入节点为N(Node),N的父节点为P(Parent),P的兄弟节点为U(Uncle),U的父节点为G(Grandpa),如下图所示:

 

 3.1.情况1

当插入的新节点N位于树的根上时,没有父节点。

这种情况下,只需要将红色节点变为黑色节点即可满足规则2 。

 

 3.2.情况2

新界点N的父节点P为黑色节点,此时不需要任何变化。

此时既满足规则4也满足规则5。尽管新节点是红色的,但是新节点N有两个黑色节点NIL,所以通向它的路径上黑色节点的个数依然相等,因此满足规则5 。

 

 3.3.情况3

 

节点P为红色,节点U也为红色,此时节点G必为黑色,即父红叔红祖黑

在这种情况下需要:

  • 先将父节点P变为黑色;
  • 再将叔叔节点U变为黑色;
  • 最后将祖父节点G变为红色;

即变为父黑叔黑祖红,如下图所示:

 3.4.情况4

 

节点P是红色节点,节点U是黑色节点,并且节点N为节点P的左子节点,此时节点G一定是黑色节点,即父红叔黑祖黑

在这种情况下需要:

  • 先变色:将父节点P变为黑色,将祖父节点G变为红色;
  • 后旋转:以祖父节点G为根进行右旋转;

 

 3.5.情况5

节点P是红色节点,节点U是黑色节点,并且节点N为节点P的右子节点,此时节点G一定是黑色节点,即父红叔黑祖黑

在这种情况下需要:

  • 先以节点P为根进行左旋转,旋转后如图b所示;
  • 随后将红色节点P黑色节点B看成一个整体的红色节点N1,将新插入的红色节点N看成红色节点P1 如图c所示。此时整体就转换为了情况4。

 

接着可以按照情况4进行处理:

  • 先变色:将N1节点的父节点P1变为黑色,将祖父节点G变为红色;

  • 后旋转:以祖父节点G为根进行右旋转,旋转后如图 e 所示;

  • 最后将节点N1和P1变换回来,完成节点N的插入,如图 f 所示;

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值