《算法导论》中红黑树删除结点的伪代码没看明白,该怎么处理
《算法导论》中红黑树删除结点的伪代码没看明白
伪代码如下
删除的结点是z,我的疑问是RB-DELETE-FIXUP(T, x)中的x到底指向什么,请懂的人就下面一个图给我解释下就行了。我自己是越看越晕。根据这个博客http://blog.****.net/v_JULY_v/article/details/6284050 下面这个图是属于case1的。但是我觉得x指向第一幅图的right[13],然后再往下看RB-DELETE-FIXUP(T, x)就不对劲了。
下面是删除结点12,第一幅是原图,第二幅是删除后的图,就这个图和伪代码给我解释下好了,主要是解释x,y均指的哪个
------解决方案--------------------
RB-DELETE-FIXUP(T, x) // T是要删除树根节点 x是要删除的树上的一个节点
1 while x ≠ root[T] and color[x] = BLACK //如果x不是树的根节点并且x节点颜色不是黑色
2 do if x = left[p[x]] // 如果x为父节点的左边孩子
3 then w ← right[p[x]] // 将父节点的右汉字赋值给w
4 if color[w] = RED // 如果w的颜色为红色
5 then color[w] ← BLACK // 则修改颜色为黑色
6 color[p[x]] ← RED // 父节点颜色修改为红色
7 LEFT-ROTATE(T, p[x]) // 左旋转x节点的父节点
8 w ← right[p[x]] // 将父节点右边孩子赋值给w
图不解释了,建议你去网上搜搜,有很详细的图解。
伪代码如下
- C/C++ code
RB-DELETE(T, z) 1 if left[z] = nil[T] or right[z] = nil[T] 2 then y ← z 3 else y ← TREE-SUCCESSOR(z) 4 if left[y] ≠ nil[T] 5 then x ← left[y] 6 else x ← right[y] 7 p[x] ← p[y] 8 if p[y] = nil[T] 9 then root[T] ← x 10 else if y = left[p[y]] 11 then left[p[y]] ← x 12 else right[p[y]] ← x 13 if y ≠ z 14 then key[z] ← key[y] 15 copy y's satellite data into z 16 if color[y] = BLACK 17 then RB-DELETE-FIXUP(T, x) 18 return y RB-DELETE-FIXUP(T, x) 1 while x ≠ root[T] and color[x] = BLACK 2 do if x = left[p[x]] 3 then w ← right[p[x]] 4 if color[w] = RED 5 then color[w] ← BLACK // Case 1 6 color[p[x]] ← RED // Case 1 7 LEFT-ROTATE(T, p[x]) // Case 1 8 w ← right[p[x]] // Case 1 9 if color[left[w]] = BLACK and color[right[w]] = BLACK 10 then color[w] ← RED //Case 2 11 x ← p[x] //Case 2 12 else if color[right[w]] = BLACK 13 then color[left[w]] ← BLACK //Case 3 14 color[w] ← RED //Case 3 15 RIGHT-ROTATE(T, w) //Case 3 16 w ← right[p[x]] //Case 3 17 color[w] ← color[p[x]] //Case 4 18 color[p[x]] ← BLACK //Case 4 19 color[right[w]] ← BLACK //Case 4 20 LEFT-ROTATE(T, p[x]) //Case 4 21 x ← root[T] //Case 4 22 else (same as then clause with "right" and "left" exchanged) 23 color[x] ← BLACK
删除的结点是z,我的疑问是RB-DELETE-FIXUP(T, x)中的x到底指向什么,请懂的人就下面一个图给我解释下就行了。我自己是越看越晕。根据这个博客http://blog.****.net/v_JULY_v/article/details/6284050 下面这个图是属于case1的。但是我觉得x指向第一幅图的right[13],然后再往下看RB-DELETE-FIXUP(T, x)就不对劲了。
下面是删除结点12,第一幅是原图,第二幅是删除后的图,就这个图和伪代码给我解释下好了,主要是解释x,y均指的哪个
------解决方案--------------------
RB-DELETE-FIXUP(T, x) // T是要删除树根节点 x是要删除的树上的一个节点
1 while x ≠ root[T] and color[x] = BLACK //如果x不是树的根节点并且x节点颜色不是黑色
2 do if x = left[p[x]] // 如果x为父节点的左边孩子
3 then w ← right[p[x]] // 将父节点的右汉字赋值给w
4 if color[w] = RED // 如果w的颜色为红色
5 then color[w] ← BLACK // 则修改颜色为黑色
6 color[p[x]] ← RED // 父节点颜色修改为红色
7 LEFT-ROTATE(T, p[x]) // 左旋转x节点的父节点
8 w ← right[p[x]] // 将父节点右边孩子赋值给w
图不解释了,建议你去网上搜搜,有很详细的图解。