红黑树
学习红黑树 之前必须懂二分查找、数据结构中的二叉树、二叉搜索树、平衡二叉树等概念
我在 数据结构与算法——Java落地(考研求职必学)一文中 给出了这些理论多地的java代码下载地址、大家可以自行查阅。
为什么会出现红黑树?
问题: 二叉搜索树可以极大的提高我们的搜索效率,但是他的在插入的时候受第一个值的限制很可能插入多个节点后变成单链表。
解决: AVL树 也就是平衡二叉树 ,它的左右子树高度之差的绝对值不超过1,这样确实可以避免一条直线,但人们认为最理想的状态,还是红黑树
红黑树的性质 (重点)
- 每个节点不是红色就是黑色
- 不可能有连在一起的红色节点
- 根节点都是黑色
- 每个红色结点的两个子节点都是黑色的,叶子节点都是黑色的
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
红黑树的构建
- 改变颜色 最简单 红变黑 黑变红
- 左旋 针对点悬,但是点上边的子树也要跟着转,指针
- 右旋
旋转和颜色变换规则
- 改变颜色的情况:
当前结点的父亲是红色,且它的祖父结点的另一个子节点也是红色。(叔叔结点):
(1)把父节点设为黑色
(2)把叔叔也设为黑色
(3)把祖父点设为红色
(4)把指针定义到祖父节点设置为当前要操作的 - 左旋:当前父节点是红色,叔叔是黑色的时候,且当前的节点是右子树,左旋
以父节点作为左旋 - 右旋:当前父节点是红色,叔叔是黑色的时候,且当前的节点是左子树,右旋
(1)把父节点设为黑色
(2)把祖父点设为红色
(3)以祖父节点旋转 TreeMap JDK 1.8
红黑树与AVL树区别
红黑树的特质:
从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。
平衡二叉树的特质:
它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。
区别:
1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。