求教一下红黑树的旋转到底有什么用处?

yxm870915 2011-02-13 08:31:05
最近在学习红黑树,其中的旋转一直没弄清楚有什么用。插入的时候首先就是按照二叉排序树插入的,多以生成的新树肯定满足二叉排序树的条件,而差的只是对于颜色的调整,但是在对颜色的判断过程中用到了旋转,但是其本身对于颜色并没有改变仅仅是改变了一下节点的排列,而颜色的判定条件本人认为与是否旋转无关,那到底为什么要旋转,不进行旋转直接对其颜色进行判断难道就不能做到整个红黑树有序吗??先谢谢各位了
...全文
609 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yxm870915 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 mlee79 的回复:]
没看懂你在说啥, 再次看代码确认插入时只有当父节点时红色时才需要旋转.. 实际上你画下图, 很容易理解这个问题..
[/Quote]就是插入的时候的5种条件,其中当插入节点的父节点和叔叔节点都为红色的时候不需要旋转,而当父节点为红色而叔叔节点为黑色或者NULL的时候需要旋转
http://blog.csdn.net/v_JULY_v/archive/2011/01/09/6124989.aspx
我是看的这里....纠结...
mLee79 2011-02-14
  • 打赏
  • 举报
回复
红黑树任意节点到其叶节点要保证经过相同数量的黑色节点, 并且不能有两个连续的红色节点.. 你对着这些条件一看就知道为什么要旋转了三.. 新插入的节点是红色的, 如果其父节点也是红色的, 就需要旋转了...
yxm870915 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mlee79 的回复:]
红黑树任意节点到其叶节点要保证经过相同数量的黑色节点, 并且不能有两个连续的红色节点.. 你对着这些条件一看就知道为什么要旋转了三.. 新插入的节点是红色的, 如果其父节点也是红色的, 就需要旋转了...
[/Quote]但是当插入节点的父节点和叔叔节点都为红色的时候不需要旋转,而当父节点微红色而叔叔节点为黑色或者NULL的是后缺需要旋转这是为什么?
mLee79 2011-02-14
  • 打赏
  • 举报
回复
没看懂你在说啥, 再次看代码确认插入时只有当父节点时红色时才需要旋转.. 实际上你画下图, 很容易理解这个问题..
yxm870915 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 npbool 的回复:]
红黑树不仅要保持结点有序,还要保证树的高度在最坏情况下也是O(lgn),旋转是为了降低树的高度,看《算法导论》
[/Quote]恩,这个我理解了,呵呵,谢谢了啊,但是还有一个问题就是怎么样判定是否需要旋转?
qq120848369 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 npbool 的回复:]
红黑树不仅要保持结点有序,还要保证树的高度在最坏情况下也是O(lgn),旋转是为了降低树的高度,看《算法导论》
[/Quote]

这个我同意,就像AVL树一样,都是要求树始终保持一定性质,所以必要时都要做操作来满足条件,你可以多关注一下红黑树的性质。
NPBool 2011-02-13
  • 打赏
  • 举报
回复
红黑树不仅要保持结点有序,还要保证树的高度在最坏情况下也是O(lgn),旋转是为了降低树的高度,看《算法导论》
yxm870915 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qq120848369 的回复:]
不懂,CSDN有人写过这个,你可以搜一下,是一个推荐贴.
[/Quote]那个我看了,但是上面也只是说保持有序,纠结....
qq120848369 2011-02-13
  • 打赏
  • 举报
回复
不懂,CSDN有人写过这个,你可以搜一下,是一个推荐贴.
yxm870915 2011-02-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyu637 的回复:]
是用来调整红黑树的红黑属性的。没有旋转操作,在插入和删除的时候可能会造成红黑树的红黑属性被破坏
[/Quote]但是旋转本身并没有改变颜色属性仅仅是改变了节点的排列,而节点的排列在插入的时候就已经按照二叉排序树进行了判定,对颜色的判定也有相应得方法,难道直接对其颜色情况判定并赋值而不使用旋转不行吗?
wuyu637 2011-02-13
  • 打赏
  • 举报
回复
是用来调整红黑树的红黑属性的。没有旋转操作,在插入和删除的时候可能会造成红黑树的红黑属性被破坏

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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