红黑树是一个自平衡二叉查找树,是计算机科学与应用的一种经典的数据结构,这个数据结构典型的用途是实现关联数组。
红黑树是一个特化的AVL树(平衡二叉树,关于二叉树的性质,在此不重述),可以在O(logn)时间内查找、插入和删除。
红黑树的性质
1、根节点是黑色
2、树的节点非黑即红
3、每个叶节点(即指树尾端的NULL指针或者NULL节点)是黑色
4、对于任意一个红节点来说,其两个子节点都是黑色
5、对于任意节点,其到叶子节点的每一条路径包含的黑色节点的数目相等
如下图所示,是一个典型的红黑树模型
红黑树的一些性质的证明
红黑树的时间复杂度为O(logn)
红黑树的树高不超过2log(n+1)
红黑树的基本操作
红黑树的插入和删除都是大概率需要对整棵树进行旋转,原因是因为对整棵树进行上述的操作以后会导致整棵树的性质不在符红黑树的特性,就退化成普通的树,就不能用红黑树的方法去利用这棵树,所以需要旋转来修正。
所以我们就对一些节点 进行定义:
X;新插入节点
P:父节点
G:祖父节点
S:伯父节点
GG:曾祖父节点
根据红黑树的插入规则,X节点为红色,根据插入节点的位置及S和GG节点的位置考虑一下的情况。
情况1:S节点为黑(null节点),并且X为外侧插入,就会对P,G进行一次右旋转,在进行改变颜色
情况2:S节点为黑(null节点),并且X为内侧插入,则会先进行一次左旋,在进行一次右旋
情况3: S节点为红,并且X为外侧插入,只需要右旋,在进行颜色变换就行
情况4: S节点为红,并且X为外侧插入。此时就需要将对整个结构进行一次右旋,然后此时会发现GG节点,则需要继续往上更新。
为了避免出现情况4,当插入一个新节点后,就会存在一个从根节点到插入节点的路径,若这条路径中,存在某个节点的两个子节点均为红色,则将该节点改红色,子节点改为黑色,这样继续进行插入,就不会导致问题。