码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树学习四:红黑树(参考维基百科)

时间:2014-12-12 16:13:24      阅读:393      评论:0      收藏:0      [点我收藏+]

标签:des   style   http   io   ar   color   os   sp   for   

  1.红黑树描述:它或是一颗空树,或是具有下面属性的二叉搜索树:

  1)节点非红即黑;
  2)根节点是黑色;
  3)所有NULL结点称为叶子节点,且认为颜色为黑 ;
  4)所有红节点的子节点都为黑色;
  5)从任一节点到其叶子节点的所有路径上都包含相同数目的黑节点。

  插入和删除操作时间可以保持为 O(log n) 次,图1(本文图来自维基百科)是一个具体的红黑树:

bubuko.com,布布扣

图1:红黑树

  2.红黑树插入:假设插入节点为红,根据邻近结点的颜色进行具体调整:

  1)为空树,直接插入,把颜色变换为黑;

  2)插入结点的父结点为黑,直接插入,不做调整;

  3)插入结点父结点和叔父结点都为红,则把他们两个重设置为黑,设置其祖父结点为红,设置过程如图2。以递归的方式检验整个树。

  bubuko.com,布布扣

图2:父叔结点都为红的处理过程

  4)父节点是红色而叔父节点是黑色或缺少,新节点是其父节点的左子节点,而父节点又是祖父节点的左子节点。进行针对祖父节点的一次右旋转,在旋转产生的树中,以前的父节点现在是新节点和以前的祖父节点的父节点,如图3所示。

bubuko.com,布布扣

图3:父红叔为黑或缺少,父为祖父左子树处理

  5)父节点是红色而叔父节点是黑色或缺少,新节点是其父节点的右子节点而父节点又是祖父节点的左子节点。进行一次左旋转调换新节点和其父节点的角色,然后按照4)进行处理。

bubuko.com,布布扣

图4:父红叔为黑或缺少,父为祖父左子树处理

  3.红黑树删除:

  1)删除是新的根,直接操作。

  2)S是红色,在N的父亲上做左旋转,把红色兄弟转换成N的祖父,我们接着对调N的父亲和祖父的颜色。

bubuko.com,布布扣

图5:S是红的处理

  3)N的父亲、S和S的儿子都是黑色的。在这种情形下,我们简单的重绘S为红色。结果是通过S的所有路径,它们就是以前通过N的那些路径,都少了一个黑色节点。

bubuko.com,布布扣

图6:N的父亲、S和S的儿子都是黑色的处理

  4)S和S的儿子都是黑色,但是N的父亲是红色。在这种情形下,我们简单的交换N的兄弟和父亲的颜色。

bubuko.com,布布扣

图7:S和S的儿子都是黑色,N的父亲是红色处理

  5)S是黑色,S的左儿子是红色,S的右儿子是黑色,而N是它父亲的左儿子。在这种情形下我们在S上做右旋转,这样S的左儿子成为S的父亲和N的新兄弟。我们接着交换S和它的新父亲的颜色。

bubuko.com,布布扣

图8:S是黑色,S的左儿子是红色,S的右儿子是黑色,而N是它父亲的左儿子处理

  6)S是黑色,S的右儿子是红色,而N是它父亲的左儿子。在这种情形下我们在N的父亲上做左旋转,这样S成为N的父亲(P)和S的右儿子的父亲。

bubuko.com,布布扣

图9:S是黑色,S的右儿子是红色,而N是它父亲的左儿子

 

 

 

 

 

 

 

 

 

 

 

 

二叉树学习四:红黑树(参考维基百科)

标签:des   style   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/xp12/p/4147479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!