红黑树的性质与包括旋转插入删除等操作(上)

Posted LNMP开发者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了红黑树的性质与包括旋转插入删除等操作(上)相关的知识,希望对你有一定的参考价值。


红黑树首先二叉搜索树的一种,只是平衡性好一些,可以保证在最坏的情况下基本动态集合操作的时间复杂度为O(lgn)。


 


性质

和普通二叉搜索树相比,它在每个节点增加了一个存储位来表示节点的颜色,可以是Red或Black, 通过对任何一条从根到叶子的简单路径上各个节点的颜色进行约束,红黑树确保没有一条路径会比其他路径高出2倍,因而近似是平衡的。

树中每个节点包含5个属性:color、key、left、right和p。

这里还有个外部节点和内部节点的说法: 把指针为nil的节点视为二叉搜索树的外部节点;而把带关键字的节点视为树的内部节点。

常规画图模式不包含根的父节点与为nil的外部节点。

一颗二叉搜索树满足以下红黑性质时,就是一个红黑树:

1、每个节点或是红色的、或是黑色的;

2、根节点是黑色的;

3、每个叶节点(nil)都是黑色的

4、如果一个节点是红色的,则它的两个子节点都是黑色的

5、对每个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。


黑高的概念

从某个节点x出发(不含该节点)到达一个叶节点的任意一条简单路径上的黑色节点个数称为该节点的黑高(black-height)。结合性质5,黑高的概念是明确定义的,一棵红黑树的黑高也就是其根节点的黑高。

 

红黑树为嘛是一棵好的搜索树?

引理: 一棵有n个内部节点的红黑树的高度至多为2lg(n+1).

原理:一棵以x为根的子树至少包括2^bh(x) - 1 的内部节点;设高度h,根据性质4,至少一半高度的为黑色,因此黑高至少为h/2;于是n>=2^(h/2) - 1;而后得到h<=2lg(n+1)

 

旋转

因为执行删除或插入,可能违反红黑树的性质;为了维护这些性质,必须要通过改变某些节点的颜色以及指针结构。

指针结构就是通过旋转来完成的;分左旋和右旋。左旋如图所示,以x到y的链为支轴进行。使得y成为该子树的根,x成为y的左孩子,y的左孩子成为x的有孩子。


动态图更具体些:


伪代码示例:


Left-rotate(T, x)

y = x.right

X.right = y.left

if y.left != T.nil {

y.left.p = x

}

//x的双亲成为y的双亲

y.p = x.p

//T.nil是红黑树引入的一个哨兵概念,表示外部节点

if x.p == T.nil

T.root = y

elseif x = x.p.left

x.p.left = y

else

x.p.right = y

//x成为y的右孩子

y.left = x     

x.p = y


以上是关于红黑树的性质与包括旋转插入删除等操作(上)的主要内容,如果未能解决你的问题,请参考以下文章

红黑树的插入与删除

红黑树的插入操作过程详细图解

红黑树

深入理解红黑树

深入理解红黑树

红黑树平衡二叉查找树