TreeMap底层实现原理

TreeMap的定义

红黑树的基本概念

红黑树节点增加、删除的实现过程 

平衡二叉树的定义 

平衡二叉树与红黑树的区别

平衡二叉树如何左旋右旋  


TreeSet集合

特点:唯一,可排序

  • 可以将元素按照规则进行排序
    • TreeSet():根据其元素的自然排序进行排序
    • TreeSet(Comparator comparator) :根据指定的比较器进行排序

  • 自然排序

就是让元素所属的类实现Comparable接口,重写compareTo(T o)方法重写接口中的compareTo方法

 @Override
    public int compareTo(Student o) {
        //按照对象的年龄进行排序
        //主要判断条件: 按照年龄从小到大排序
        int result = this.age - o.age;
        //次要判断条件: 年龄相同时,按照姓名的字母顺序排序
        result = result == 0 ? this.name.compareTo(o.getName()) : result;
        //三目运算符 result=0表示年龄相同,按照姓名字母排序,result不等于0返回本身
        return result;
    }
  • 比较器排序Comparator

创建TreeSet集合使用带参构造方法。

让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法。

  TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
            @Override
            public int compare(Teacher o1, Teacher o2) {
                //o1表示现在要存入的那个元素 新的
                //o2表示已经存入到集合中的元素 旧的
              
                //主要条件
                int result = o1.getAge() - o2.getAge();  //升序
                //次要条件
                result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
                return result;
            }
        });
        //新的-旧的 >0 存到旧的右边  <0  存到旧的左边 =0 重复 不存

红黑树基本概念

TreeMap的实现是红黑树算法的实现,所以要了解TreeMap就必须对红黑树有一定的了解。

红黑树(Red Black Tree)是一种自平衡二叉查找树,它最早被称之为“对称二叉 B 树”,

 

红黑树的特点

  • 平衡二叉B树
  • 每一个节点可以是红或者黑
  • 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的

红黑树的规则

  1. 每一个节点或是红色的,或者是黑色的。
  2. 根节点必须是黑色。
  3. 每个叶节点(NIL节点,空节点)是黑色的。
  4. 如果某一个节点是红色,那么它的子节点必须是黑色。在一条路径上不能出现相邻的两个红色节点。
  5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。

红黑二叉树而言它主要包括三大基本操作:左旋、右旋、着色。

红黑树节点的颜色

添加节点的颜色默认为红色,根节点为黑色,叶子节点为黑色。

 

添加节点的操作

添加位置为非根节点:

  • 父节点为黑色: 默认为红色
  •  父节点为红色:
    • 叔叔节点为红色

                将"父节点"设为黑色,将"叔叔节点"设为黑色

                将"祖父节点"设为红色

                如果"祖父节点"为根节点,则将根节点再次变成黑色

        

如图所示,添加节点2时违背了红黑树规则(相邻节点不能都是红色)。

解决步骤:1.将父节点3和叔节点8变黑;2.将奶奶节点5变红,但如果节点5是根节点,就不能变色。

 

  • 叔叔节点为黑色

                将"父节点"设为黑色

                将"祖父节点"设为红色

                以"祖父节点"为支点进行旋转

(1)右旋 

右旋指的是围绕某个节点向右旋转,也就是顺时针旋转某个节点,此时父节点会被自己的左子节点取代。

 

如下图所示,2号节点的父节点为红色,叔节点为黑色。2号节点为左节点,2号节点的父节点为左节点,所以符合左左的情况,我们进行右旋

右旋之后我们将原来的父节点变黑,将原来的奶奶节点变红。
(2)左旋

左旋指的是围绕某个节点向左旋转,也就是逆时针旋转某个节点,使得父节点被自己的右子节点所替代,如下图所示

 

(3)右旋再左旋

如图是红黑树的一部分,8号节点的父节点为红色,叔节点为黑色。8号节点为右节点,8号节点的父节点为左节点,所以符合左右的情况。
在这里插入图片描述
我们进行左旋再右旋并变色:
在这里插入图片描述

平衡二叉树

左右子树高度差小于等于1二叉排序树

平衡二叉树的规则

  • 每个节点最多只有两个子节点(二叉)
  • 每个节点的值比它的左子树所有的节点大,比它的右子树所有节点小(有序)
  • 每个节点左子树的高度与右子树高度之差的绝对值不超过1

为了维持树的平衡,在插入和删除平衡二叉树的结点时会进行一定的操作来保持平衡,其中包括以下几种情况,以及解决方法:

  • 左左(LL):右旋解决
  • 左右(LR):先左旋再右旋
  • 右右(RR):左旋解决
  • 右左(RL):先右旋再左旋

简明说法:左旋即把该节点变为左孩子右旋即把该节点变为右孩子

 平衡二叉树和红黑树的区别

  • 平衡二叉树的左右子树的高度差绝对值不超过1,但是红黑树在某些时刻可能会超过1,只要符合红黑树的五个条件即可。
  • 二叉树只要不平衡就会进行旋转,而红黑树不符合规则时,有些情况只用改变颜色不用旋转,就能达到平衡。

  • 平衡二叉树的时间复杂度虽然优于红黑树。
  • 红黑树的插入删除比AVL树更便于控制操作
  • 红黑树整体性能略优于AVL树(红黑树旋转情况少于AVL树)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值