内容学习于:edu.aliyun.com


1. 原理简介

  通过整个的二叉树的实现相信已经可以清楚二叉树的主要特点:数据查询的时候可以提供更好的查询性能,但是这种原始的二叉树的结构是有明显缺陷的,例如:当二叉树结构改变的时候(增加或删除)就有可能出现不平衡的问题。
  如下图所示:
  之前所谓的解决二叉树性能问题的方式最终全部都变为了null,也就是说如果要想达到最良好效果的二叉树,那么它首先应该是一个平衡二叉树,同时所有的节点的层次深度应该相同。
  如下图所示:
  如果所有的数据按照以上的结构进行保存,那么二叉树的检索操作执行效率一定是最高的,可是你的树需要可以忍受着这些频繁的增加或者是删除操作。所以针对于二叉树有了进一步的设计要求:
  红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则。这些规则使红黑树保证了一种平衡,<mark>插入、删除、查找的最坏时间复杂度都为O(logn)。</mark>

代码:

enum Color{
    RED,BLACK
}

class BinaryTree<T>{
    private class Node{
        private T data;
        private Node partent;
        private Node left;
        private Node right;
        private Color color;
    }
}

  对于Node节点中的颜色标记也可以使用true或false来实现,不一-定非要使用枚举类,一个标准的红黑树的结构如下图所示:


  <mark>红色节点之后绝对不可能是红色节点,但是没有说黑色节点之后不允许是黑色节点,允许黑-黑连接,</mark>
  主要是利用这个红色节点与黑色节点实现均衡的控制。简单点理解红黑树的结构就是为了可以进行左旋和右旋控制以保证树的平衡性。
  如下图所示:
  <mark>但是对于平衡性,还需要考虑数据增加的平衡以及数据删除的平衡,增加和删除都是需要对这棵树进行平衡修复。</mark>

2. 数据插入平衡修复


  在进行红黑树处理的时候为了方便操作都会将新的节点使用红色来进行描述,于是当设置根节点的时候就会违反“规则2”,那么这个时候只需要将节点的颜色涂黑即可。






  <mark>在红黑树进行修复处理之中,它需要根据当前节点以及当前节点的父节点和叔叔节点之间的颜色来推断树是否需要进行修复处理。</mark>

3. 数据删除平衡修复






  <mark>在红黑树之中修复的目的是为了保证树结构中的黑色节点的数量平衡,黑色节点的数量平衡了,那么才可能得到“O(logn)'的执行性能,但是修复的过程一方面是红黑的处理, 另外一方面就是黑色子节点的保存层次。</mark>

  从JDK 1.8开始,Java 大量采用了红黑树数据结构进行类库的实现,这样做的目的就是为了提升性能,但是对于红黑树的操作并不需要你们去记住具体的代码(如果你真的在面试之中有人让你写代码了,千万别灰心,因为你一定写不出来,可以写出来的人也不多,你可以把<mark>修复和旋转的流程写出来</mark>)。

  <mark>面试题:请你解释一下什么叫红黑树?</mark>

  红黑树的主要目的是实现一种平衡二叉树,这样可以达到最优的查询性能,时间复杂度为(O(logn)、 n为数据个数);
  在红黑树之中是利用红黑的节点以及保存的层次来决定是否需要修复处理的状态,修复的操作的状态主要就是变色与旋转。
  红黑树的结构要求:

  • 每个节点或者是黑色,或者是红色; .根节点必须是黑色;
  • 每个叶子节点是黑色;
  • 如果一个节点是红色的,则它的子节点必须是黑色的;
  • 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点数量;**