`
liyiwen007
  • 浏览: 107680 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

《算法导论》笔记--红黑树(一)

阅读更多

   

满足下面几个条件的二叉搜索树,称为红黑树:

1.       任何一个节点都被着色――红色或是黑色。

2.       根节点是黑色的。

3.       所有的NIL节点都看成黑色(NIL节点是就是一个假想的或是无实在意义的节点,所有应该指向NULL的指针,都看成指向了NIL节点。包括叶节点的子节点指针或是根节点的父指针)。

4.       如果一个节点是红色的,那么它的子节点一定是黑色的。

5.       对于任何一个节点而言,从该节点到它的子孙节点中的NIL节点路径中,所包含的黑节点个数相同。

 

黑高度的定义:

从任何一个节点,向下到底部的路径中,包含的黑节点的个数,称为这个节点的黑高度。从红黑树的第5条性质可以看出,黑高度是唯一的、确定的。

 

只要同时满足红黑树的这些条件,就一定会有“红黑树可以保证任何两条从根部到树叶的路径节点个数相差不超过2倍”这个平衡的性质。

我们可以假设,如果存在两条路径LSLS长两倍以上(S路径上有n个节点,L上有大于2n个节点)。可知,S的黑高度最大只可能是n,那么根据第5条性质,L的黑高度也大也只可能是n,也就是,L路径上一定有超过n个红色节点(因为节点不是黑的就必定是红的)。所以,肯定会有两个以上的红色节点是相邻的。这就与第4个条件矛盾了。所以,红黑树可以保证任何两条从根部到树叶的路径节点个数相差不超过2倍。

 

红黑树的高度h<2lg(n+1)(这个在《算法导论》13.1节中有证明)。也就是说,红黑树的操作的时间复杂度是O(lgn)的。 

 

二叉搜索树的操作时间复杂度,取决于树高h,因此,我们当然就希望h尽量地小以提高操作的效率。从直观上就可以发现,二叉搜索树各子树的规模越平均,它的高度就会越小。所以在应用中,一般都会将二叉搜索树实现成一种平衡树,以保证最差时间复杂度为O(lgn)。红黑树就是其中的一种,应用得很广泛(SGI STLsetmap就是基于红黑树来实现,Linux内核中也用到这个数据结构

红黑树是二叉搜索树的一种。它与普通二叉搜索树不同的是,红黑树的每个节点都附加了另一个属性――颜色,可以是红色,也可以是黑色。通过对于每条路径上节点颜色的规则进行限定,红黑树可以保证任何两条从根部到树叶的路径节点个数相差不超过2倍。所以,红黑树是一种近似平衡的二叉搜索树。

 

红黑树的查找、最大值、最小值、前趋、后继等操作,与普通的二叉搜索树没有什么区别。插入和删除操作需要重新实现。仅仅用普通的二叉搜索树的插入和删除动作,可能会破坏红黑树本身的一些性质,因此,需要进行额外的处理。这些额外的处理主要是改变树节点的颜色,或是改变树的结构。

 

 

 

 

 

 

树的旋转

改变树的结构,主要是用旋转。旋转有两种,左旋和右旋,下面是这两种旋转的: 

这种旋转的操作,是在二叉搜索树的局部对树的结构进行调整的一种方式,经过旋转之后,二叉搜索树的性质是不会发生改变的。如下图:
 

 

向红黑树插入节点,先将需要插入的节点着成红色,用普通二叉搜索树的方法将这个节点插入到树中,然后再想办法把被破坏的红黑性质恢复。(将新插入的节点颜色着成红色,呆以尽量减少对红黑性质的破坏,恢复起来也容易。因为插入红色节点的话,那么被破坏的部分会在局部,考虑的问题也就比较少,恢复过程也容易形成递归,详细见下文说明)

我们考虑下,如果一个红色节点(下文称用Z指向它)被插入到树中,那么有哪些红黑性质可能被破坏呢?只有第2条(根节点是黑色的)以及第4条(红色节点的子节点一定是黑色节点),其它都不会被破坏。

如果插入的节点的父节点是黑色的,那么不需要做任何调整,这红黑树是正常的。如果父节点是红色,或没有父节点(也就是插在了树根的位置),那么就要进行调整以保证红黑树是正确的。

首先对第4 条进行分析,我们知道,插入一个新的节点,这个节点肯定会被放到树的底部成为一个叶节点(参考普通二叉树的插入过程),那么这个红色节点就没有可能和自己的子节点同色(因为叶节点的子节点是NIL节点,都是黑色的),如果第4条被破坏的话,肯定是Z指向的节点的父节点是红色的。因此,为了使分析和解决更加容易和清晰,我们在对树进行调整以恢复红黑特性时,始终使得Z总是指向相邻红色的节点中的子节点(指针Z可能会向上升到树的中部或根部)。基于这个做法,我们可以知道,如果是第2条被破坏了的话,也就是Z指向根节点了,那么第4条肯定就符合了(因为Z的父节点是NIL,黑色的),因此对第2条性质的恢复变得很简单,只需要被根从红色变为黑色即可。这时,所有性质都会被满足了(因为是根节点,所以根节点被着为黑色时,所有路径都黑高会统一加1,也就是第5条不会被破坏,操作之后的红黑树仍然是正确的)。好了,现在只留下第4条性质的恢复的问题了。

如果第4条被破坏了,也就是说,Z的父节点是红色的,那么,说明,Z一定有祖父节点,而且是黑色的(否则插入前原树就有问题,又或是调整时的方法不正确)。因此可以把问题放到以Z的祖父节点为根节点的子树内进行解决,这样可以把调整的范围最小化,而且这也是有可能的:只要不改变这子树的黑高度,那么就不会对树的其它部分产生影响。我们要做的就是在这个子树范围内把红黑性质调整回来。再看子树的根是否与其父节点同为红色,是的话,就再次用前面所说的去解决它,一直向上递归到红黑性质被恢复为止。

 

红黑树的节点插入 

 

  对第4条性质的恢复,根据Z的父节点是Z的祖节点的左子节点还是右子节点,分为两组对称的情况,每组有3种情况。下面我们只对其中一组进行说明,以Z的父节点是Z祖节点的左子节点为例:  

RBT-Insert3

第一种:Z的“叔父”节点是红色。

 

             RBTree1 

 

如上图所示,在这种情况下,将父、叔节点都着为黑色,再将子树根节点着为红色,那么子树的黑高度没有发生改变,而且红黑性质得得到了调整。此时,再将Z指向子树的根节点,向上递归恢复红黑特性。

 

第二种:Z的“叔父”节点是黑色的,Z的父节点的左子节点。
 

如上图,将Z的父节点与祖节点进行一次右旋,并把父节点着黑色,原来的祖节点着红色。这些子树的红黑特性得到了恢复,而且子树的黑高度没有变化。另外,由于子树根节点已经是黑色了(这个节点不会出现父子同为红色的问题了),所以不必再向上递归了,此时整个树的红黑特性都已经是正确的了。

 

第三种:Z的“叔父”节点是黑色的,Z的父节点的右子节点。 

 

如上图,将Z本身与其父节点进行一次左旋,让Z指向原来的父节点,就可以调整为情况二,而情况二已经得到解决。

这样,红黑树的节点插入问题就得到了解决。

 

  • 大小: 8.2 KB
  • 大小: 5.5 KB
  • 大小: 5.4 KB
分享到:
评论
2 楼 liyiwen007 2010-07-20  
dracularking 写道
第三种情况的图是不是不对,z成左子节点了?

确实有问题~!谢谢你的提醒,已经修正了图片。

1 楼 dracularking 2010-07-20  
第三种情况的图是不是不对,z成左子节点了?

相关推荐

    算法导论--教师手册

    《算法导论--教师手册》是一本为教育者设计的辅助教材,旨在配合《算法导论》第二版的深入学习。此手册由Thomas H. Cormen、Clara Lee和Erica Lin共同编著,作为对Thomas H. Cormen、Charles E. Leiserson、Ronald L...

    红黑树_算法详解_算法导论_20130505【for_wind】

    (不需要资源分,不能修改上次的,只好重传了...红黑树算法(算法导论) 详解 【for_wind】,介绍了红黑树性质,详细分析了红黑树旋转,插入,删除等基本操作。其中算法的伪代码和算法导论中一致。 个人总结的,分享了。

    算法导论授课教案学习笔记

    这份"算法导论授课教案学习笔记"是针对该书的深入学习资源,包括了教学教案、课后作业及解答,对于正在学习算法的学生来说,无疑是一份极其宝贵的参考资料。 教程部分可能涵盖以下知识点: 1. **算法基础**:介绍...

    读书笔记:《算法导论》版本的红黑树实现.zip

    读书笔记:《算法导论》版本的红黑树实现

    MIT(麻省理工)算法导论笔记

    《MIT(麻省理工)算法导论笔记》是一份详细记录了麻省理工学院(Introduction to Algorithms)课程精华的学习资料。这门课程是全球计算机科学专业学子深入理解算法的基石,其重要性不言而喻。尽管由于文件大小限制,...

    算法导论试题及答案

    《算法导论》是计算机科学领域的一本经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写,广泛应用于全球各大高校的教学中,包括知名的麻省理工学院(MIT)。...

    麻省理工算法导论及笔记

    《算法导论》是计算机科学领域的一本经典著作,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写。这本书深入浅出地介绍了各种基础和高级算法,为学生和研究人员提供了...

    算法导论答案算法导论教师手册

    《算法导论》详细介绍了各种数据结构,如数组、链表、栈、队列、哈希表、二叉树、红黑树等,以及如何选择合适的数据结构来优化算法性能。 #### 排序算法 排序算法是算法研究中的一个核心主题。《算法导论》详细讲解...

    算法导论(课后答案)

    本材料提供了《算法导论》第二版的课后答案手册,由原书作者之一Thomas H. Cormen以及Clara Lee和Erica Lin共同编写。这份资料包含了书中多个章节的教学笔记和练习题解答,覆盖了算法的基础概念、复杂度分析、排序...

    算法导论教师手册

    - **讲座笔记**:分别介绍了几种经典的排序算法(如堆排序、快速排序、线性时间排序等)和常用的数据结构(如哈希表、二叉搜索树、红黑树等),并讨论了它们的应用场景和优缺点。 - **解决方案**:对每种算法和数据...

    麻省理工算法导论全套笔记

    《麻省理工算法导论全套笔记》是一份深入学习算法的宝贵资料,源自世界顶级学府麻省理工学院(MIT)的课程。这份笔记涵盖了广泛的算法主题,旨在帮助读者掌握算法设计、分析以及实现的核心概念。以下是根据提供的...

    算法导论读书笔记(整理别人的)

    《算法导论》是计算机科学领域的一本经典著作,它深入浅出地介绍了各种重要的算法,并提供了详尽的分析和实现。这篇读书笔记主要涵盖了以下几个方面的重要知识点: 1. **算法基础**:算法是解决问题的步骤序列,是...

    读书笔记:根据算法导论和sky王的资料详细的对红黑树的算法的实现.zip

    读书笔记:根据算法导论和sky王的资料详细的对红黑树的算法的实现

    麻省理工算法导论读书笔记

    《麻省理工算法导论读书笔记》是一份深入学习算法理论和实践的宝贵资源,源自世界顶级学府麻省理工学院的教学资料。这份笔记涵盖了算法分析、设计策略、数据结构等多个核心主题,对于想要深入了解算法的朋友们极具...

    算法导论的笔记与答案

    - **讲座笔记**:介绍了红黑树这一平衡二叉搜索树的特殊类型,以及它的性质和用途。 - **解决方案**:提供了红黑树的插入、删除操作的实现细节,并通过实例演示了其平衡过程。 ##### 2.12 第十四章:增强数据结构 -...

    算法导论答案《introduction to algorithms》

    《算法导论》(*Introduction to Algorithms*)是计算机科学领域内的一本经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest 和 Clifford Stein合著,并由MIT出版社与McGraw-Hill Book Company...

    算法导论(第二版)teacher's book

    《算法导论》(第二版)教师用书是一部专为教师设计的教学辅助资料,旨在帮助教师更好地讲解和理解算法概念及其应用。该教师用书是《算法导论》(第二版)教材的补充材料,适用于计算机科学专业的本科生及研究生课程...

    MIT公开课——算法导论教材

    《MIT公开课——算法导论教材》是一份源自美国麻省理工学院(MIT)的珍贵教育资源,专注于教授计算机科学中的核心概念——算法。这份教材涵盖了排序、树和Hash等基础但至关重要的算法,对于学习和理解计算机科学的...

    算法导论 课后解答 教师用书

    - **主题讲解**:从哈希表到二叉搜索树,再到红黑树和增强数据结构,这一系列章节的讲座笔记深入介绍了高级数据结构的设计和优化策略。 - **解决方案**:课后解答提供了数据结构操作的详细步骤,以及如何在特定条件...

    算法导论教师手册(含答案)

    **《算法导论教师手册》**是一本专门为教师设计的手册,旨在辅助他们更好地教授MIT出版的《算法导论》第二版教材中的内容。该手册由Thomas H. Cormen、Clara Lee与Erica Lin共同编写,并作为对Thomas H. Cormen、...

Global site tag (gtag.js) - Google Analytics