写在前面
红黑树比较难以理解。之前学过一遍,后来又忘了,现在再次学习一遍并记录下来。
在次之前 建议先去了解一下 树 二叉树 平衡二叉树。JAVA里面的TreeMap。 因为TreeMap底层就是红黑树。
注: 此文字部分截图来源视频网站,如有侵权,可联系本人,敬请谅解。
先来了解一下二叉树
二叉树: 节点度的最大值为2。可以为0. 比如6无子节点,可以为1,比如5的子节点是10, 可以为2, 比为1 、2、3的子节点。
查找二叉树
不多做解释。 左小右大。 根节点比左节点大,比右节点小。
优点: 提升查找效率。 查找效率为根节点到这个节点的深度。比如查找8为3次,查找11需要4次。查找15需要5次。
下图也是查找二叉树,但是发现查找效率不平均, 比如查找20需要2次, 查找70需要6次。如果数据量有1000W,最多可能查找1000W。
由此, 我们将提出平衡二叉树。 先看AVL树
左子树和右子树到节点的深度相差不超过1
如图所示 20->13度为1, 20->30深度为1 , 相差为0;
如图所示 20->13度为1, 20->40深度为2, 相差为1;
如图所示 20->13度为1, 20->50深度为3, 相差为2; 这样就不是AVL树了。
AVL树的缺点
1:插入效率低, 因为要维持树的平衡(旋转二叉树)
比如如图, 插入60的时候,就需要平衡了。
这时候需要左旋,左旋后效果如下
再看一个列子
此时需要右旋
调整过程第一步:
第二步:
以上为预备知识, 接下来正式看红黑树
红黑树特性
1:每个节点要么是黑色,要么是红色
2:根节点是黑色
3:每个叶子节点(NIL)是黑色(这里的叶子节点是指为NIL或者NULL)
4:如果一个节点是红色的,则他的子节点必须是黑色的(不要求1个节点是黑色的,他的子节点是红色的)
5:从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
左子树和右子树到节点的深度相差不超过2倍(与AVL树的区别)
先看一个图
下面介绍几种插入节点场景
1: 父节点是红色,直接插入
插入40
红黑树使用场景:
最常用的就是TreeMap
可以看到EnterSet源码
左旋代码:
右旋代码:
插入后调整
删除后调整
以上学习笔记根据视频整理
http://www.iqiyi.com/w_19ru1e6xr1.html