Red-black tree

lj_suxin 2012-12-13 06:31:36
大家好,我有个关于红黑树的问题想请教下。
在红黑树的插入算法(RB-INSERT(T,z))的子程序RB-INSERT-FIXUP(T,z)的伪代码中,为什么没有考虑
whilecolor[p[z]]<-RED//
do if p[z]=left[p[p[z]]]
then y<-right[p[p[z]]]
if color[y]=RED
then color[p[z]]<-BLACK
color[y]<-BLACK
color[p[p[z]]]<-RED
z<-p[p[z]]
else if z=right[p[p[z]]]
then z<-p[z]
LEFT-ROTATION(T,z)
color[p[z]]<-BLACK
color[p[p[z]]]<-RED
RIGHT-ROTATION(T,p[p[z]])
else (same as then clause
with "right" and "left" exchanged)
color[root[T]]<-BLACK

在最初的时候,为什么没考虑color[p[z]]<-BLACK?在这种情况下,若color[left[p[z]]]=BLACK, color[z]=red,若不进行颜色调整,就违反了红黑树的性质5:For each node, all paths from the node to descendant leaves contain the same number of black nodes.

如果一个node颜色是RED,那是不是一定有两个真实的子节点,或者没有子节点?










...全文
162 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lj_suxin 2012-12-21
  • 打赏
  • 举报
回复
终于解决了,谢谢各位! 当新插入的节点z是某一个黑色节点的第二个孩子节点时,则为了满足性质5,该黑色节点的第一个孩子节点必然是红色的。
lj_suxin 2012-12-19
  • 打赏
  • 举报
回复
或者说,有没有一个节点是黑色的,但是此黑色节点的两个子节点(要求是真实的叶子节点),一个是红色的,一个是黑色的?
lj_suxin 2012-12-19
  • 打赏
  • 举报
回复
在红黑树中,在调整节点的前,新插入的节点一定是叶子节点(这里指的是真实的节点,不是空节点)。这时,若父节点是黑色的,新插入的节点做右孩子节点,左孩子节点(真实的节点)是黑色的,那么从根节点到左孩子节点的路径上的黑色节点的数目就会比从根节点到右孩子节点的路径上的黑色节点的数目多一个,从而违反了红黑树的性质5.
碎碎念 2012-12-17
  • 打赏
  • 举报
回复
在最初的时候,为什么没考虑color[p[z]]<-BLACK?在这种情况下,若color[left[p[z]]]=BLACK, color[z]=red,若不进行颜色调整,就违反了红黑树的性质 插入节点z之前,默认红黑树已经是满足条件的了,插入一个节点z,并将其设置为红色,这样不影响红黑树的黑高度,如果p[z]== back,那么就不需要调整了。。。即使color[left[p[z]]] = black,color[z] = red,也不会破坏红黑树性质。。。因为在插入之前红黑树已经是满足条件的了
lj_suxin 2012-12-17
  • 打赏
  • 举报
回复
Thank you!
FancyMouse 2012-12-15
  • 打赏
  • 举报
回复
>为什么没考虑color[p[z]]<-BLACK? 因为这种情况下rbtree的性质没有被破坏,可以直接返回。你加了一个红节点进去,从根到叶的黑节点数目没有发生变化,你说的违反其实根本没违反。 >如果一个node颜色是RED,那是不是一定有两个真实的子节点,或者没有子节点? 是。如果只有一边有实际节点的话,那个节点必须是黑色,然后就违反了黑节点数目的性质。
lj_suxin 2012-12-15
  • 打赏
  • 举报
回复
Thank you very much!
newtee 2012-12-13
  • 打赏
  • 举报
回复
到这里发帖子比较好http://bbs.csdn.net/forums/ST_Arithmetic

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧