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树
- 每一个节点可以是红或者黑
- 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的
红黑树的规则
- 每一个节点或是红色的,或者是黑色的。
- 根节点必须是黑色。
- 每个叶节点(NIL节点,空节点)是黑色的。
- 如果某一个节点是红色,那么它的子节点必须是黑色。在一条路径上不能出现相邻的两个红色节点。
- 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
红黑二叉树而言它主要包括三大基本操作:左旋、右旋、着色。
红黑树节点的颜色
添加节点的颜色默认为红色,根节点为黑色,叶子节点为黑色。
添加节点的操作
添加位置为非根节点:
- 父节点为黑色: 默认为红色
- 父节点为红色:
- 叔叔节点为红色
将"父节点"设为黑色,将"叔叔节点"设为黑色
将"祖父节点"设为红色
如果"祖父节点"为根节点,则将根节点再次变成黑色
如图所示,添加节点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树)