数据结构 - 红黑树 RB-Tree

红黑树存在的意义:

红黑树是一种典型的数据结构,任何一种数据结构的存在都有其意义,一定是在某个应用方面存在着极高的利用价值,红黑树是一种高效查找算法数据结构。下面首先简要的给出目前典型的查找方法

(1)暴力搜索:顾名思义,就是对待查找的数据从头到尾遍历,是思路最简单但效率低下的算法,但并不意味着暴力搜索方法就不存在了应用。

(2)二分查找:二分查找是一种高效的查找算法,但二分算法查找的应用条件是查找序列应为有序序列,转换成数据结果就是二叉查找树(二叉搜索树、二叉排序树),时间复杂度为O(logn)。

(3)哈希查找:哈希查找是最高效的查找方法,时间复杂度为O(1),但哈希查找存在“Hash冲突”,详见Hash。

(4)bfs/dfs:图论中的搜索方法。

(5)B-Tree:有的称为B树,有的称为B-树。

(6)B+Tree:B+树

(7)二叉搜索树:是一种满足“左<根<右”的特殊二叉树,极端的二叉搜索树是一种不平衡的二叉树,退化为链表结构,查找的时间复杂度O(n),这种情况显然不符合二分查找的思想,由此引进了平衡树(AVL)的概念,但AVL追求的是极致的平衡,实际应用中不会应用。

(8)红黑树:高效的查找算法数据结构,底层的数据结构就是一种“特殊的二叉查找树”,就是为了避免二叉搜索树退化为链表的这种情况。

红黑树:

1、定义:

红黑树首先是一种二叉查找树,我们通常称其具有5个特点:

(1)树结构中每个节点有一个存储位代表该节点颜色:红/黑;

(2)根节点一定是黑色的;

(3)树结构中不可能有相连的红色节点;

(4)每个红色节点的子节点一定都是是黑色的(与3其实一致);

(5)叶子节点都是黑色的。

经过科学验证,只要满足以上5个条件的红黑树,都是基本达到平衡的二叉树,也就不会出现二叉搜索树在极端不平衡条件下退化为链表的情况。

2、性质:

根据红黑树的定义,可以得到红黑树具有一下性质:

(1)根节点为黑色,每个节点非红即黑;

(2)叶子节点为黑;

(3) 如果一个节点为红,那么他的子节点为黑;

(4)对任意节点而言,其到叶子节点的每条路径都包含相同数目的黑节点。

(5)插入最多两次旋转,删除最多三次旋转。

3、基本操作:

(1)节点的插入:以二叉搜索树插入的方法进行数据插入,节点默认为红色;

(2)判断:节点插入后,基于红黑树的5个特点判断该树是否需要进行调整,如果满足则继续(1)插入,否则对树进行(3)调整;

(3)调整:变色、左旋、右旋;

详述红黑树构建流程:

红黑树的三个基本调整操作为:变色、左旋、右旋,下面先简述三种操作方法,然后结合一个构建红黑树的实例,对红黑树的基本操作进行分析。

(1)变色:

所有插入的节点默认为红色,将当前插入的节点视为目标节点当目标节点的父节点也为红色,且其叔节点(父节点的兄弟节点)也为红色时,进行如下调整:

父节点变为黑色;

叔节点变为黑色;

爷节点变为红色;

转移目标节点为爷节点,在进行判断,看其是否满足红黑树性质,如不满足继续调整。

                                      

上图中左图为调整前,右图为调整后。左下角的6号节点为当前插入的节点,默认为红色,将其视为目标节点,观察可知目标节点的父、叔节点都为红色,不满足特点3,需要进行变色调整,父、叔节点变为黑色,爷节点变为红色,目标节点变为爷节点。

调整后,目标节点又不满足了特点3,但是其叔节点不是红色,不满足变色操作的条件,此时需要进行左旋或右旋操作,下面介绍左旋。

(2)左旋:

当目标节点为红色、父节点为红色,叔节点为黑色,且目标节点为其父节点的右子树节点,则以“目标节点 - 父节点”这条线进行左旋调整:

目标点提上去变为父节点;

父节点降下去变为目标节点的左子树;

原目标节点的左子树挂到原父节点的右子树上;

目标节点变为原父亲节点,继续进行判断。 

                 

上图中,目标节点为12红色,父节点5红色,叔节点30黑色,目标节点为右子树,满足左旋条件,围绕着5 - 12这条线进行左旋调整,调整结果如右图所示,调整后,目标节点变为5。

此时目标节点5为红色,父节点12为红色,叔节点为黑色,不满足红黑树性质,继续调整。

(3)右旋:

当目标节点为红色、父节点为红色,叔节点为黑色,且目标节点为其父节点的左子树节点,则以“父节点 - 爷节点”这条线进行右旋调整:

父节点变黑;

爷节点变红;

父节点提上去变为爷节点;

爷节点落下去变为父节点的右子树;

原父节点的右子树挂到原爷节点的左子树;

                 

上图中,左图为调整前,右图为调整后。调整前,目标节点5红色,父节点12红色,叔节点30黑色,目标节点为父节点的左子树,进行右旋:父节点12变为黑色,爷节点19变为红色,父节点12提上去变为,爷节点19降为右子树,原父节点12的右子树13挂到原爷节点19的左子树上,调整结束。

猜你喜欢

转载自blog.csdn.net/iea5357/article/details/106986941
今日推荐