您的位置:首页 > 其它

算法导论 红黑树加入节点

2011-03-03 13:37 246 查看
RB-INSERT-FIXUP:

加入一个新节点时可能出现的问题:

1.被加入节点是红节点,且原红黑树为空,这时只要把节点x涂成黑色即可。

2.被加入的红节点的父节点也是红节点,即z和p[z]都为红色,这就违背了特点4。

问题1可通过算法最后一行解决。问题2是算法主要结局的问题。

问题2分两种情况,p[z]为左子节点,p[z]为右子节点,而对二者是相反的,只需列举一种情况即可。以左节点为例。

p[z]为左子节点分三种情况,在三种情况下,z和p[z]都是红节点。z是新加入的节点,所以z是红节点。Fixup函数只想以前,要检查p[z]的颜色,p[z]=red时,才违背第4个特点(红节点的子节点是黑节点)才需要执行Fixup算法。

情况1:z,p[z],y=right(p[p[z]])=uncle(z),三者都为红节点,

p[z],uncle(z)涂成黑色,p[p[z]]涂成红色,z移动到p[p[z]]。

情况2:uncle(z)为黑节点,且z是右节点(也就是说z与p[z]不在同一侧),

LEFT-ROTATE(T,p[z])。

情况3:uncle(z)为黑节点,且z是左节点(也就是说z与p[z]在同一侧)

p[z]被涂成黑色,p[p[z]]被涂成红色,然后RIGHT-ROTATE(T,p[p[z]])。

以上在书上都能找到。

算法思想:

先判断p[z]是p[p[z]]的左子节点还是右子节点,分两种情况讨论。每一种情况又分为三个小情况。以p[z]是左子节点为例。

第一种情况是最简单的,更改p[z]和uncle[z]的颜色,再对p[p[z]]重复本算法即可。

遇到第二种情况时,首先要想办法转换为第三种情况,也就是,当uncle[z]为黑色(在第一种情况中是红色),z为右节点时(当p[z]为右结点是,z为右节点时,也就是z与p[z]在不同方向),通过ROTATION,将z与p[z]变换到同一方向上,即情况3。

对于情况三,就好说了。想办法将左子树多余节点移到右子树,以维持平衡,实现二叉树的最小高度。

总而言之,Fixup的作用就是,当红黑树的两边由于节点数量不平衡,要将节点多的一边的节点移动到另一边。后面的Delete函数中涉及到的Fixup的目的亦然。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: