数据结构学习笔记(21)----红黑树

来源:互联网 发布:新开淘宝店要授权 编辑:程序博客网 时间:2024/06/05 14:25

(一)什么是红黑树

对于红黑来说,其是从AVL树演变而来,因此首先应该满足AVL(平衡二叉树)的性质。然后在满足以下性质:
(1)节点非红即黑
(2)根节点必须是黑
(3)叶子结点为空且必须为黑
(4)任意一个节点到叶节点的路径中黑节点子树相同
例如:

满足上述性质就是一棵红黑树了,但是对于红黑树的删除与插入必须也要满足以上的条件,下面就来说一下红黑树的插入与删除

(二)红黑树的插入,插入时候情况比较复杂,分为很多种情况,插入一般都是红色节点,原因很简单,当插入红色节点时,只是破坏了性质(2)与性质(3),情况较少。 另为叙述方便我们给将要插入的节点标为N(红色),父节点为P,祖父节点为G,叔节点为U。下边将一一列出所有插入时遇到的情况:

情形1:当为空树时候,此时只有一个节点N(不满足性质1),只要把N改为黑色就可以了。

情形2:当不为空时候,但是父节点为黑色,这时候只要直接插入节点就不会破坏红黑树。

情形3:当N为红,P为红,祖父节点一定存在且为黑,叔父节点也为红。
这时候就需要把G改为红,叔节点改为黑,父节点改为黑,但是这时候还没结束,由于祖父节点为红,可能祖父节点G的父节点为红这就又又违反了性质,但依然按照原先的方式进行向上检索。知道满足为止。例如:

情形4: N为红,P为红,U为黑,G为黑(或者P为G的右孩子,N为P的左孩子;反正就是同向的)这时候只要将G变为黑,以P为轴顺时针旋转就可以 ,例如:

情形5: N为红,P为红,U为黑,P为G的左孩子,N为P的右孩子(或者P为G的右孩子,N为P的左孩子;反正两方向相反)。这时候需要以N为轴旋转至P原来的是位置。这时候就出现了情形4的情形,只要按照情形4做相应的变换就OK.

(三)红黑树的删除

情形1 :S为红色(那么父节点P一定是黑,子节点一定是黑),N是P的左孩子(或者N是P的右孩子)。

情形2: P、S及S的孩子们都为黑。

情形3: P为红(S一定为黑),S的孩子们都为黑。

情形4: P任意色,S为黑,N是P的左孩子,S的右孩子SR为红,S的左孩子任意(或者是N是P的右孩子,S的左孩子为红,S的右孩子任意)。

操作:SR(SL)改为黑,P改为黑,S改为P的颜色,P、S变换–这里相对应于AVL中的右右中的旋转(或者是AVL中的左左旋转),结束。
解析:P、S旋转有变色,等于给N这边加了一个黑节点,P位置(是位置而不是P)的颜色不变,S这边少了一个黑节点;SR有红变黑,S这边又增加了一个黑节点;这样一来又恢复了平衡,结束。

**情形5:**P任意色,S为黑,N是P的左孩子,S的左孩子SL为红,S的右孩子SR为黑(或者N是P的有孩子,S的右孩子为红,S的左孩子为黑)。

操作:SL(或SR)改为黑,S改为红,SL(SR)、S变换;此时就回到了情形4,SL(SR)变成了黑S,S变成了红SR(SL),做情形4的操作即可,这两次变换,其实就是对应AVL的右左的两次旋转(或者是AVL的左右的两次旋转)。

(四):红黑树的应用场景

(1)红黑树多用在内部排序,即全放在内存中的,微软STL的map和set的内部实现就是红黑树。
(2)红黑树在函数式编程中也特别有用,