`

学习红黑树

阅读更多
红黑树(Red Black Tree) 是一种自平衡二叉查找树。

它是在1972年由Rudolf Bayer发明的,当时被称为平衡二叉B树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。

红黑树在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

*红黑树的性质
红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

性质1. 节点是红色或黑色。

性质2. 根节点是黑色。

性质3 每个叶节点(NIL节点,空节点)是黑色的。

性质4 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)

性质5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。

要知道为什么这些特性确保了这个结果,注意到性质4导致了路径不能有两个毗连的红色节点就足够了。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。因为根据性质5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。

用途
红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用如即时应用(real time application)中有价值,而且使它们有在提供最坏情况担保的其他数据结构中作为建造板块的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树。

红黑树在函数式编程中也特别有用,在这里它们是最常用的持久数据结构之一,它们用来构造关联数组和集合,在突变之后它们能保持为以前的版本。除了O(log n)的时间之外,红黑树的持久版本对每次插入或删除需要O(log n)的空间。

在红黑树上只读操作不需要对用于二叉查找树的操作做出修改,因为它也是二叉查找树。但是,在插入和删除之后,红黑属性可能变得违规。恢复红黑属性需要少量(O(log n))的颜色变更(这在实践中是非常快速的)并且不超过三次树旋转(对于插入是两次)。这允许插入和删除保持为 O(log n) 次,但是它导致了非常复杂的操作(具体参考http://blog.csdn.net/longerzone/article/details/7817533)。
分享到:
评论

相关推荐

    红黑树的源码与测试函数

    学习红黑树,你需要理解以下关键概念: - **红黑树的性质**:包括每个节点要么是红色要么是黑色,根节点是黑色,所有叶子节点(NIL节点)是黑色,红色节点不能相邻(即不能有两个连续的红色节点),从任意节点到其每...

    红黑树学习文档

    在学习红黑树的过程中,理解其性质、插入和删除操作的流程,以及如何通过旋转和重新着色来恢复平衡是非常关键的。同时,掌握Java中红黑树的具体应用,比如`TreeMap`的内部实现,有助于提升对数据结构和算法的理解和...

    红黑树学习参考资料集合

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出,它的设计目标是在保持查询效率的同时,通过特定的规则自动调整树结构...对于想要掌握高级数据结构和算法的IT专业人士来说,深入学习红黑树是非常有价值的。

    红黑树的C实现,算法导论的红黑树C实现

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972...《算法导论》这本书提供了详细的红黑树理论和实现指导,是学习红黑树的重要资源。通过阅读书中的代码和实践,可以深入理解红黑树的工作原理及其C语言实现细节。

    java实现的红黑树

    6. **学习红黑树的意义** - 理解红黑树可以帮助我们更好地理解和优化数据结构,提高算法效率。 - 对于Java开发者来说,了解红黑树能加深对集合类的理解,有助于编写高效代码。 7. **实现细节** - Java中的红黑树...

    红黑树C源代码

    红黑树是一种自平衡二叉...通过阅读和理解源代码,可以深入学习红黑树的实现细节,对于理解和掌握数据结构与算法有着极大的帮助。同时,它也提供了一个在实际编程环境中应用红黑树的实例,对于提升编程能力大有裨益。

    RedBlack(红黑树讲义)

    红黑树是一种自平衡二叉查找树,由计算机科学家罗伯特·西格沃克(Robert Sedgewick)和威尔海姆·普拉特(Wilhelm Pohl)...通过深入学习红黑树,可以更好地理解和应用这类自平衡二叉查找树,提高软件的性能和可靠性。

    红黑树的Java实现参考源码

    红黑树(Red-Black Tree)是一种自平衡的二叉查找树,它的设计目标是保持树的平衡,从而在插入、删除和查找操作时都能...学习红黑树不仅可以提升你的数据结构知识,也有助于提高你在处理动态数据集合时的算法设计能力。

    红黑树-动态演示生成红黑树

    通过这样的动态演示,学习者可以更深入地理解红黑树的工作原理,以及为何它在实际应用中被广泛用于数据结构如映射、集合和优先队列等。在编程语言如C++、Java和Python中,红黑树常被用作标准库的一部分,提供高效的...

    红黑树的c++实现

    学习红黑树的C++实现,不仅需要掌握红黑树的理论知识,还需要理解C++中的指针、内存管理和面向对象编程。通过阅读和分析源代码,可以深入理解红黑树的内部机制,提升数据结构和算法的运用能力。

    红黑树 C++ 源代码 数据结构 算法

    在学习红黑树的过程中,理解其基本概念和性质是首要步骤,然后通过实际编写和调试C++源代码加深理解。实践是检验理论的最好方式,通过实现和测试红黑树的各种操作,可以更好地掌握这种数据结构的精髓。同时,对于...

    非常好的红黑树教程,值得一看

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,由计算机科学家Rudolf Bayer在1972年提出。它在数据结构和算法领域具有重要...这份教程将详细解释红黑树的构造、操作以及如何维护其性质,是学习红黑树的理想资料。

    红黑树代码

    《算法导论》是学习红黑树的一个经典参考资料,书中详细解释了红黑树的理论和实现。通过C语言实现红黑树,可以更好地理解其内部机制,包括节点结构定义、插入、删除、旋转等关键函数的编写。 在压缩包文件"rbtree...

    java 树的数据结构 红黑树的实现 学习路线

    学习红黑树,你需要了解其插入和删除操作的细节,以及如何通过旋转和重新着色来保持树的平衡。 "一种新型的树以及相关分析"可能是指一些高级或特定用途的树结构,如B树、B+树、AVL树等。这些树型在数据库索引、文件...

    红黑树.zip

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出。它的设计目标是在保持查找、插入和删除...通过深入学习红黑树,我们可以提升在算法和数据结构领域的专业素养,这对于任何IT专业人士来说都是非常有价值的。

    hongheishu.rar_红黑树

    红黑树(Red-Black Tree)是一种自平衡二叉查找树,由计算机科学家Rudolf Bayer在1972年提出...通过阅读和分析这个项目中的代码,你可以深入学习红黑树的实现细节,并可能将其应用到自己的项目中,提高数据处理的效率。

    数据结构红黑树详解

    6. **学习红黑树的意义**: 理解红黑树有助于深入理解数据结构和算法,提升编程能力,特别是在处理大量数据的排序、查找等场景,能够编写出高效且稳定的代码。 7. **应用拓展**: 红黑树的原理也可以应用于其他自...

    C++数据结构 红黑树 实现全部功能

    通过阅读和理解这些代码,你可以深入学习红黑树的工作原理和C++中的实现细节。 总结来说,红黑树是一种重要的数据结构,它的核心在于通过特定的平衡策略保持了二叉查找树的高效性。在C++中实现红黑树需要理解其基本...

    红黑树完整实现文件

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出。它的设计目标是在保持二叉查找树基本属性的同时,通过引入颜色(红色或黑色...理解和掌握红黑树的实现对于学习数据结构和算法、提升编程技能具有重要意义。

    红黑树swing版演示程序

    这是本人编写的一个swing版的红黑树演示程序,假如您希望学习红黑树或者查看该工具用法,可以到http://blog.csdn.net/cdnight/article/details/10583177 看看。

Global site tag (gtag.js) - Google Analytics