Ce7c8f72000c8e0c304d983dc9c10680
数据结构与算法——红黑树

1 引言

  红黑树是树的数据结构中最为重要的一种。Java的容器TreeSet、TreeMap均使用红黑树实现。JDK1.8中HashMap中也加入了红黑树。C++ STL中的map和set同样使用红黑树实现。之前的文章已经详细介绍了2-3-4树的性质与操作。本篇文章将从2-3-4树与红黑树关系出发,详细阐明红黑树。
  2-3-4树和红黑树是完全等价的,但是2-3-4树的编程实现相对复杂,所以一般是通过实现红黑树来实现替代2-3-4树,而红黑树也同样保证在O(logN)的时间内完成查找、插入和删除操作。

2 定义

  红黑树是每个节点都带有颜色属性的平衡二叉查找树 ,颜色为红色黑色。除了二叉查找树一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

(1)节点是要么红色或要么是黑色。
(2)根一定是黑色节点。
(3)每个叶子节点都带有两个空的黑色节点(称之为NIL节点,它又被称为黑哨兵)。
(4)每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。
(5)从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点。

例如:图2.1所示的一棵红黑树:
图2.1

图2.1

定义节点名称:
父节点——P(Parent)
祖父节点——G(GrandParent)
叔叔节点——U(Uncle)
当前节点——C(Current)
兄弟节点——B(Brother)
左孩子——L(Left)
右孩子——R(Right)

3 性质

  根节点到任意叶子节点的路径长度,最多相差一半。若树存在最短路径,则最短路径上均为黑色节点,那么第五条性质保证根节点到达最长路径与最短路径所包含的黑色节点数目相同,若最短路径长为N,则最长路径M=N+红色节点数目,性质4要求红色节点必定不连续,因此红色节点数目最多为N,则最长路径与最短路径最多相差N。

4 2-3-4树和红黑树的等价关系

  如果一棵树满足红黑树,把红色节点收缩到其父节点,就变成了2-3-4树,所有红色节点都与其父节点构成3或4节点,其它节点为2节点。一颗红黑树对应唯一形态的2-3-4树,但是一颗2-3-4树可以对应多种形态的红黑树(主要是3节点可以对应两种不同的红黑树形态)。

例如:


5 查找

红黑树的查找操作与二叉搜索树查找方式一致,这里不再赘述。

6 插入

6.1 插入节点的父节点为黑色

  若待插入节点的父节点为黑色,则直接插入节点,并将插入的节点涂红,插入结束。父节点为黑色,插入红色节点并不会使红黑树违背5条性质。
此种情形对应的在2-3-4树中的插入操作为:待插入位置的节点为2-节点或者3-节点,直接插入节点。
图解:

6.2 插入节点的父节点为红色,叔叔节点为黑色

  若待插入节点的父节点为红色,叔叔节点为黑色,此种情形又需要区分节点的插入位置,根据插入位置的不同进行相应的调整。此种情形共有四种:

6.2.1 父节点P为G左孩子,插入位置为左孩子

  若待插入节点C的父节点P是祖父节点G的左孩子,并且插入节点的位置位于父节点P的左孩子。调整过程如下:

图解:
  1:插入后违背性质4,首先以祖父节点G为中心,执行右旋操作。

  2:右旋操作结束,将父节点P涂黑色,祖父节点G涂红色,调整完毕。

6.2.2 父节点P为G左孩子,插入位置为右孩子

  若待插入节点C的父节点P是祖父节点G的左孩子,并且插入节点的位置位于父节点P的右孩子。调整过程如下:

图解:
  1:插入后违背性质4,首先以父节点P为中心,执行左旋操作。

  2:左旋操作结束后,仍然违背性质4,此时的情形符合6.2.1。在以节点G为中心,执行右旋操作。右旋结束后,将节点C涂黑色,节点G涂红色,调整完毕。

6.2.3 父节点P为G右孩子,插入位置为右孩子

  若待插入节点C的父节点P是祖父节点G的右孩子,并且插入节点的位置位于父节点P的右孩子。此种情形是6.2.1情形的镜像。调整过程如下:

图解:
  1:插入后违背性质4,首先以祖父节点G为中心,执行左旋操作。

  2:左旋操作结束,将父节点P涂黑色,祖父节点G涂红色,调整完毕。

6.2.4 父节点P为G右孩子,插入位置为左孩子

  若待插入节点C的父节点P是祖父节点G的右孩子,并且插入节点的位置位于父节点P的左孩子。此种情形是6.2.2的镜像。调整过程如下:

图解:
  1:插入后违背性质4,首先以父节点P为中心,执行右旋操作。

  2:右旋操作结束后,仍然违背性质4,此时的情形符合6.2.3。在以节点G为中心,执行左旋操作。左旋结束后,将节点C涂黑色,节点G涂红色,调整完毕。

6.3 插入节点的父节点为红色,叔叔节点为红色

  若待插入节点C的父节点P为红色,且叔叔节点U为红色,则需要根据插入位置的不同,做出相应的调整。此种情形共有两种:

6.3.1 插入位置为左子树

6.3.2 插入位置为右子树


top Created with Sketch.