【集合框架】红黑树

红黑树与TreeMap

基本性质

  1. 每个节点都只能是红色或者黑色
  2. 根节点是黑色
  3. 每个叶节点(NIL节点,空节点)是黑色的。
  4. 如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

关键性质

从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这棵树大致上是平衡(左右子树的深度差不多)的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。所以红黑树它是复杂而高效的,其检索效率O(log n)。

三大基本操作:左旋、右旋、着色。

几个重要的属性:

        //比较器,因为TreeMap是有序的,通过comparator接口我们可以对TreeMap的内部排序进行精密的控制
        private final Comparator<? super K> comparator;
        //TreeMap红-黑节点,为TreeMap的内部类
        private transient Entry<K,V> root = null;
        //容器大小
        private transient int size = 0;
        //TreeMap修改次数
        private transient int modCount = 0;
        //红黑树的节点颜色--红色
        private static final boolean RED = false;
        //红黑树的节点颜色--黑色
        private static final boolean BLACK = true;

对于叶子节点Entry是TreeMap的内部类,它有几个重要的属性:

        //键
        K key;
        //值
        V value;
        //左孩子
        Entry<K,V> left = null;
        //右孩子
        Entry<K,V> right = null;
        //父亲
        Entry<K,V> parent;
        //颜色
        boolean color = BLACK;

增加节点的算法

红黑树在新增节点过程中比较复杂,复杂归复杂它同样必须要依据上面提到的五点规范,同时由于规则1、2、3基本都会满足,下面我们主要讨论规则4、5。假设我们这里有一棵最简单的树,我们规定新增的节点为N、它的父节点为P、P的兄弟节点为U、P的父节点为G。

《【集合框架】红黑树》 红黑树增加节点

对于新节点的插入有如下三个
关键地方:

1、
插入新节点总是红色节点 。

2、如果插入节点的父节点是黑色, 能维持性质 。

3、如果插入节点的父节点是红色, 破坏了性质. 故插入算法就是通过
重新着色
旋转, 来维持性质 。

新增的五种情况:
一、为根节点
二、父节点为黑色
三、若父节点P和P的兄弟节点U都为红色
四、若父节点P为红色,叔父节点U为黑色或者缺少,且新增节点N为P节点的右孩子
五、父节点P为红色,叔父节点U为黑色或者缺少,新增节点N为父节点P左孩子

put()

主要分为两个步骤,第一:构建排序二叉树,第二:平衡二叉树
对于排序二叉树的创建,其添加节点的过程如下:
1、以根节点为初始节点进行检索。
2、与当前节点进行比对,若新增节点值较大,则以当前节点的右子节点作为新的当前节点。否则以当前节点的左子节点作为新的当前节点。
3、循环递归2步骤知道检索出合适的叶子节点为止。
4、将新增节点与3步骤中找到的节点进行比对,如果新增节点较大,则添加为右子节点;否则添加为左子节点。

delete()

    原文作者:小呀么小黄鸡
    原文地址: https://www.jianshu.com/p/44eebbf5628f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞