红黑树 RBTreee

来源:互联网 发布:dubstep软件 编辑:程序博客网 时间:2024/06/04 00:22

1.  红黑树是二叉查找树.

2.  插入

要点

1. 插入新节点总是红色节点

2. 如果插入节点的父节点是黑色,RB性质不变

3. 如果插入节点的父节点是红色, 破坏了性质. 重新着色或旋转 

算法

假设要插入的节点标为N,N的父节点标为P,N的祖父节点标为G,N的叔父节点标为U.

1. N = root, N->黑, over。

2. P = 黑, over。

3. P = (P可能是G的左孩子,也可能是右孩子,以下只说明左孩子的情况)

3. 1  U = 红  如下变换,over.



3.2  U =  N为P的孩子,P为G的左孩子 (同理 :U =   N为P的孩子,P为G的右孩子) -> 转 3.3


3.3  U =   N为P的孩子,P为G的左孩子 (同理 :U =   N为P的孩子,P为G的右孩子) over.


3. 删除

(前提:删除节点只有一个非空孩子,

如果有两个非空孩子,用此节点前驱(或后继)的值替换此节点的值,注意只是值,此节点和此节点的前驱(或后继)的颜色维持不变。)

要点

如果删除节点有非空孩子,用此孩子替换掉删除节点。注意是整个节点替换,包括颜色。

如果删除节点没有非空孩子,用任一叶子节点替换。(叶子永远是黑色).

1. 如果删除节是黑色, RB性质不变

2. 如果删除节是红色, 破坏了性质. 重新着色或旋转

算法

假设N为删除节点(d)的孩子,N的父节点为P,N的祖父节点标为G,S为N的兄弟节点,SL,SR分别为S的左右子节点.

1. d = 红, 删除,over。

2. N = ,d=黑,设置N=红,除了N变为root。over。

3. 1  P, S,  SL, SR全黑, 如下变色处理,然后以P为N转case 1



3.2 P黑, S红, SL,SR全黑, 如下旋转变色,转下面case5处理


4. P为红,S,  SL,SR全黑, 如下变换, over


5. P不管为红还是黑,S为P的右孩子,S黑, SL红,SR黑, 如下旋转变色,转下case


6. 如下,over




原创粉丝点击