`
endual
  • 浏览: 3557546 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

红黑树的一些概念

 
阅读更多

普通的二叉树作为数据存储有重要的优势,可以快速的找到一个给定的关键字,数据项,并且可以快速的插入

和删除数据项。其他的数据存储结构,数组有序数组链表在执行这些操作的时候却很满。

 

但是。遗憾的是二叉树搜索树有一个很麻烦的问题就是:如果树中插入的是随机数据,那么执行的效果很好。

但是,如果插入的是有序的数据或者逆序数据,速度就变的特别慢。因为当插入的数据有序时,二叉树就是非平衡了,而对于非平衡树,

它的快速查找 删除 插入能力就没有了。

 

红黑树就是增加了一些特点的二叉搜索树。

 

还有其他的一些方法来保持树的平衡的。

 

本章将要讨论的在红黑树中插入方法和在已经讲过的在其他数据结构中的方法有点不同,但是理解红黑树很重要。因为这一点,也因为有大量

的对称情况,实际的代码要比人们想象的长而且复杂。因为通过研究代码学习算法十分困难。所以,在这一章中没有程序代码。

 

平衡二叉树

 

不平衡树的效率--- N

我们在插入的时候,一般的二叉树如果遇到有序的数据 比如 1 2 3 4 5 6 7 8 9 那么1 作为根节点,剩余就是成了右节点,

其实就是我们想的那种链表了,所以查找的话 就是要 n的时间复杂度了,而不是logN的情况。

这是极度不平衡的树

 

一般不平衡球情况效率

对于随机数据的实际数量来说,一颗树特别不平衡的情况是不大可能的。但是,可能会有一小部分有序数据

使树的部分非平衡。搜索部分非平衡树的时间要在N 到 logN之间 ,这要看树的不平衡度要看了

 

 

平衡的补救

为了能用较快的时间logN来搜索一颗树,需要保证树总是平衡的(或者至少大部分是平衡的),这就是说树中的每个节点在它

左边后的后代数目和右边的后代数目要大概的相等。

   红黑树的平衡是在插入的过程中(删除时也是,但是暂时忽略这个问题)取得的。对一个要插入的数据项,插入的时候要检查下不会补破坏

   树的一定的特征。如果破坏了,程序就要去纠正,根据需要更改树的结构,通过维持树的特征,保持了树的平衡。

 

   红-黑树的特征

   这种树有什么好神奇的呢?有两个特征就是 一个简单,一个比较复杂:

   节点都有颜色

   在插入和删除的过程中,要遵守保持这些颜色的不同排列的规则

 

 带颜色的节点

 在红黑树中,每一个节点或者是黑色的或者是红色的,也可以是任意的两种颜色的。实际上,所说的颜色是任意的比方。可以用其他的类似的

 方法来表示。比如可以说每一个节点不是深色的就是浅色的。不过对于颜色就是偏于标记。在节点类中增加一个数据字段,可以是boolean类型的

 用来表示颜色。

 

 节点的红黑特征通过节点编辑的颜色来表示的。

 

 

 红黑树的规则

 

 当插入(或者删除)一个新的节点时,必须要遵守一定的规则,他们被称为红黑规则。如果遵守这些规则,树就是平衡的。下面简要的介绍下这些规则

 1.每一个节点不是红色就黑色()

 2.根总是黑色的

 3.如果节点是红色的,则它的子节点必须是黑色的

 4.根到叶子节点或者空节点的每条路径,必须包含相同数据的黑色的节点

 

 规则4中的(空子节点)是指非叶子节点可以接子节点的位子。换句话说,就是一个有右子节点的节点的可能接左节点的位子,或者是有左子节点

 的节点的可能接右子节点位子。

        仔细的说明:

       在从根到叶子点的路径上的黑色节点的数据叫做黑色高度。规则4的另一种陈述方式是所有从根到叶子节点路径上的黑色高度必须相同。

   这些规则可能使人一头雾水。看不清楚这些怎么能使得一颗树平衡,然而他们做到了;某些很聪明的人发明了他们。请把这些抄在变迁上,

   并且经常的看

 

   重复的关键字

   如果有多余一个数据项的关键字的值相同,将会出现什么情况呢?这给红黑树提出了一个小问题。把有相同关键字的数据项分配到其他也由相同关键字

   数据项的两则是很重要的。这也就是说,如果关键子的序列为50 50 50 要把第二个50放到第一个50的右边,并且把第二个50放到第一个50的左边,否则

   树将不平衡了

    在插入算法中,用某种随机的过程处理相同关键子节点的分配问题。但是,如果要找到所有相同的关键词,插入过程就变的更加复杂了。

目前我们学习的时候不考虑关键词是一样的 

分享到:
评论

相关推荐

    红黑树原理详解

    这里仅列举了一部分红黑树插入和删除的基本概念和处理策略。实际应用中,这些操作可能需要结合具体情况和红黑树的性质进行更复杂的调整。理解红黑树的工作原理对于实现高效的数据结构和算法至关重要,特别是在需要...

    红黑树的源码与测试函数

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

    红黑树java操作代码 红黑树是java里面遍历性能最好数据结构

    下面将详细介绍红黑树的概念、性质以及如何在Java中实现它。 **1. 红黑树的概念** 红黑树是由Rudolf Bayer在1972年提出的,它是一种特殊的二叉查找树,每个节点都带有颜色属性,可以是红色或黑色。它的主要目标是在...

    gcc 红黑树(二叉搜索树 红黑树 动态排序树 精确计时)

    红黑树则是在二叉搜索树的基础上增加了一些规则来保证其自平衡性。这些规则包括: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点(NIL或空节点)都是黑色。 4. 如果一个节点是红色,那么...

    从2-3树理解红黑树

    2-3树是一种特殊的树形数据结构,而红黑树则是一种对2-3树进行颜色编码以实现更简洁表示的抽象概念。通过理解2-3树,我们可以更好地理解红黑树的运作机制。 首先,让我们详细讨论2-3树。2-3树是一种每个节点最多...

    红黑树简单实现

    理解并实现红黑树可以帮助我们深入掌握计算机科学中的基础概念,并提升在实际问题中的解决方案设计能力。通过本项目,我们可以学习到如何在代码中实现这些理论,并通过实践加深对红黑树的理解。

    轻松搞定面试中的红黑树问题

    本文将深入探讨红黑树的相关概念及其应用场景,帮助读者更好地理解和掌握这一重要的数据结构。 #### 1. STL中的`set`底层使用的是什么数据结构? C++标准模板库(STL)中的`set`容器底层使用的是红黑树(Red-Black...

    红黑树的C++实现

    以下是关于红黑树的一些关键知识点: 1. **红黑树性质**: - 每个节点都带有颜色属性,要么是红色要么是黑色。 - 根节点是黑色。 - 所有叶子节点(NIL或空节点)是黑色。 - 如果一个节点是红色,则它的两个子...

    红黑树demo python代码

    此外,可能还有`search`方法用于查找节点,以及一些辅助方法如`rotate_left`、`rotate_right`、`color_flip`等用于维护红黑树的平衡。 对于初学者来说,理解这些代码可以帮助深入理解红黑树的工作原理。通过阅读...

    红黑树与区间树算法实现

    红黑树和区间树是两种在计算机科学中广泛使用的数据结构,主要应用于高效的数据管理和查询。在本实验中,我们探讨了如何用C++来实现这两种数据结构,并提供了相关的可视化功能。 红黑树是一种自平衡二叉查找树,由...

    Java实现的红黑树

    红黑树(Red-Black Tree)是一种自平衡的二叉查找树,由计算机科学家Rudolf Bayer在1972年提出。它在保持二叉查找树特性的同时,通过引入颜色属性来确保树的平衡,从而提高数据操作的效率。在Java中,红黑树被广泛...

    红黑树 - Robert Sedgewick 2008

    "红黑树 - Robert Sedgewick 2008"是Robert Sedgewick教授于2008年在普林斯顿大学发表的关于红黑树的经典讲解,它从2-3-4树的概念入手,逐步深入到红黑树的实现和性质。 2-3-4树是红黑树的一种简化模型,用于直观...

    红黑树的算法实现和改进

    本文将详细阐述红黑树的基本概念,其特性以及常见的操作,包括插入、删除和查找等,并对其中的删除旋转算法进行了优化,以提升整体的运行效率。 红黑树的核心特性是它的每个节点都带有颜色属性,可以是红色或黑色,...

    红黑树画图C#

    总的来说,红黑树是数据结构中的一个重要概念,它在C#编程中被广泛应用于高效的数据管理,特别是需要快速查找、插入和删除操作的场景。通过理解红黑树的性质和操作,开发者能够创建出性能优异的数据结构解决方案。

    Linux内核红黑树

    红黑树是一种自平衡二叉查找树,由Rudolf Bayer在1972年提出。它是计算机科学中一种非常重要的数据结构,被广泛应用于现代操作系统、数据库管理系统、编译器和其他高性能软件中,特别是在Linux内核中扮演着至关重要...

    java实现红黑树

    下面将详细解释红黑树的基本概念以及这两个类中的关键代码。 红黑树的特性: 1. 每个节点要么是红色,要么是黑色。 2. 根节点是黑色。 3. 所有叶子节点(NIL或空节点)都是黑色。 4. 如果一个节点是红色,则它的两...

    红黑树的c语言代码实现

    根据给定的信息,本文将详细解释红黑树的C语言实现方法,并重点解析代码中涉及的关键概念和技术要点。 ### 红黑树简介 红黑树是一种自平衡二叉查找树,它通过确保树在任何操作后都能保持平衡来提供高效的查找、...

Global site tag (gtag.js) - Google Analytics