图解数据结构之红黑树的那点事

1.前言

最近在研究java的HashMap源码,涉及到红黑树的数据结构,看着很是恼火、费劲,所以还是需要先学习一下红黑树,在看源码效果会好点。本篇文章主要是利用一些实例图解了一些简单的过程。同时也是对学习的一些记录。方便以后温习用。

2.2-3树的插入顺序

在看红黑树之前,我们必须先明白什么是2-3树,这对于红黑树的理解有很重要的作用,同时也会对理解B类树也有很大帮助。下面图解的方式演示了插入元素的过程。

图例:

       1)蓝色方框为原始元素;

       2)绿色方框为新插入元素;

       3)棕色实心箭头为插入元素过程,箭头下面为插入的数字,上面的为分析过程;

       4)棕色虚线箭头为插入元素的中间过程。

3.红黑树特性

1)节点是红色或黑色。

2)根节点是黑色。

3)每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点) 。

4)从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。(这条是由2-3树属于完全二叉树决定的)。

4.红黑树与2-3树的关系

2-3树中的两元素节点中,左侧节点在红黑树中为红色节点(这是红黑树的约定,也就是不允许出现2-3树中的两元素节点中的右元素不能为红色节点)

5.红黑树涉及到的基本操作

5.1 颜色反转(flipcolor)

5.2 左旋转(leftRotate)

5.3 右旋转(rightRotate)

6 红黑树元素的插入

有上图可以知道,左旋转、右旋转、颜色反转是一个调用链的操作。即:如果插入元素为小于顶级节点,大于红色子节点,所以是从上图第二个开始转换;如果插入元素小于顶级节点并且小于红色节点,也就是上图中的第三个步骤开始转换;如果插入元素大于根部节点,则从上图中第四个开始转换。

7.红黑树分析

1)红黑树与AVL比较

红黑树的最大高度为2log(n),是AVL平衡二叉树log(n)的二倍,也就是说查询速度要略逊于AVL。那么为什么JDK的HashMap为什么没有用到AVL,而是选择了红黑树,究其根底就是HashMap中并不是单纯的查询操作,还有一份插入操作。也就是做出的一个权衡。

2)红黑树与链表

红黑树虽然能保证黑色节点满足log(n)的要求,但是还有红色节点的存在,极端的情况极有可能退化为链表或者高度极度不平衡的。这也算上红黑树的一个缺点。

发布了72 篇原创文章 · 获赞 24 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/oYinHeZhiGuang/article/details/103655915