红黑树(1) - 介绍

1.红黑树性质

红黑树是一种自平衡二叉查找树(BST),其中的每个节点都遵守下面的规则:

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

性质2. 根节点是黑色

性质3. 所有叶子都是黑色(叶子是NIL节点)

性质4. 如果一个节点是红的,则它的两个儿子都是黑的。 (即不可能存在相邻的连个红色节点。红色节点不能有红色父节点或红色孩子节点)

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

2.红黑树结论

结论1:

红黑树的这五个性质强调了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。为什么呢?性质4暗示着任何一个简单路径上不能有两个毗连的红色节点,这样,最短的可能路径全是黑色节点,最长的可能路径有交替的红色和黑色节点。同时根据性质5知道:所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。

根据这个性质,可知这个树大致上是平衡的。因为树的一些操作,比如插入、删除和查找等操作,在最坏情况时间下都与树的高度成比例,因此这个树的高度限制使得红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树(BST)。

结论2:

拥有n个节点的红黑树的高度height <= 

这个结论可以基于下面的事实来证明:

1) 对于一颗通用的二叉树, 假设k是所有从根节点到叶子路径中最少的节点数量, 则n >= 2k – 1 (例如,如果k是3,则n最少是7)。这个表达式也可以写为k <=

2) 从上面所述的红黑树的性质5,可以得到,一颗包含n个节点的红黑树,存在一条从根节点到叶子的路径,其中最多有个黑色节点。

3) 从红黑树的性质4,可以得到,一颗包含n个节点的红黑树,其中至少有[n/2]个黑色节点。

从上面的这几点,可以得到这个结论:n个节点的红黑树的高度height <= 

结论3:

在红黑树中若x只有一棵非空子树,则x必为黑色。

证明:假设x为红色,根据性质4可以推出x有两个黑色子节点。与x只有一棵非空子树矛盾。

结论4:

在红黑树中若x只有一棵非空子树。则该非空子树的根必为红色,且该非空子树仅且只有一个根节点。

证明:假设y为x的左孩子,节点y的颜色为黑色,且y有子树。由于y是黑色,x的右子权为空,所以从x到其左子树各叶子结点的路径上黑色结点数大于x到其右子树叶到叶节点的路径上黑色节点数,违反性质5,所以节点y为红色。因为y为红色,如果y的子树存在,根据性质4可以得出y的两棵子树必为黑色。从x到经过y到各叶节点的路径上的黑色节点数大于到右子树叶节点路径上的黑色节点数。

同上所述,当y为x的右孩子时也可以证明结论4.

3.为何需要红黑树?

二叉查找树的大部分操作(例如搜索,最大值,最小值,插入,删除等)需要O(h)次的时间,其中h是树的高度。极端情形下,这些操作可能需要O(n)的时间。如果我们能够确保在每次的插入和删除操作之后,树的高度能维持在O(Logn),则我们就能保证所有这些操作的上限值为O(Logn)次. 红黑树的高度总是O(Logn),其中n是节点个数。

4.与平衡二叉树(AVL tree)的对比

AVL树比红黑树更加平衡,但是AVL在进行插入或删除时,需要进行更多次数的旋转。因此,如果应用程序需要频繁的进行插入和删除操作,则使用红黑树更好。如果进行插入和删除的次数比较少,而查找的次数更多,则选用AVL树比红黑树要好。

5.红黑树如何确保平衡?

下面使用一个简单的例子来理解平衡。3个节点的链式结构不可能出现在红黑树中。我们可以尝试所有的颜色组合并使之违反红黑树的性质。

a).3个节点的链式结构不可能是红黑树

下面的都不是红黑树:

        30                30                    30       
       /    \               /   \                   /       20  NIL         20   NIL           20   NIL
    / \                  /   \                   /   \
  10  NIL         10  NIL            10  NIL
违反性质5         违反性质5        违反性质4
b).下面是可能的红黑树组合
         20                               20
       /   \                              /          10     30                    10       30
    /  \   /  \                       /   \      /   NIL  NIL NIL NIL          NIL NIL  NIL NIL

从上面的例子中,我们可以知道红黑树是如何确保平衡的。

6.疑问

红黑树中的节点能否全部是黑节点?

答案是:可以!因为它并没有违反红黑树的任何性质。红色节点只允许有黑色孩子,但是黑色节点既可以有红色孩子也可以有黑色孩子。

可以参考stackoverflow上面的关于这个的讨论。

http://stackoverflow.com/questions/6406658/is-a-tree-with-all-black-nodes-a-red-black-tree

本系列的后续文章会介绍插入以及删除等操作。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 08:14:01

红黑树(1) - 介绍的相关文章

红黑树详细介绍三

根据之前红黑树的原理和<算法导论>上面的伪代码,我用代码将增加和调整的代码实现了一下,如有不对请大家指正.代码可以结合前两篇文章看. 红黑树的详细介绍一 红黑树详细介绍二 /* * ===================================================================================== * * Filename: rbtree->h * * Description: red black tree * * Version:

红黑树详细介绍二

删除 RB-TRANSPLANT(T,u,v)函数是将u子树用v来代替,在替换的时候分为了三种情况,如果u就是root结点则直接替换u,如果树里面还包含有其它结点,则将u的左右子树转移到v的左右子树上面. RB-TRANSPLANT(T,u,v) if u.p == T.nil T.root = v else if u == u.p.left u.p.left = v else u.p.right = v v.p = u.p 删除代码 RB-DELETE(T,z) y = z y-origina

算法---红黑树实现介绍(一)

一.概述 红黑树是一种经典的存储结构,就其本身来说是一个二叉查找树,只是在这个基础上,树的节点增加了一个属性用于表示颜色(红或黑).通过限制从根节点到叶子的各个路径的节点着色的限制,来保证不会有哪个路径会比其它的路径长度超过2倍,从而红黑树是接近平衡的. 一直以来没有把红黑树完全理解,总觉得太难,望而生畏,最近下决心要弄清楚,也是花了很长时间,不过总算是明白了.记录下来以便更好的理解. 二.红黑树的特点 作为红黑树,需要有这5个限制,如下: 1)树中的每个节点,要么是红色,要么是黑色 2)树的根

算法--红黑树实现介绍(二)

一.概述 在前一篇中我们回顾了红黑树的特点及添加的处理,可以得知红黑树首先是一个二叉查找树,在此基础上通过增加节点颜色的约束来使得红黑树近似平衡.当我们添加或者删除节点时,我们需要对树进行调整以使其重新满足红黑树.这涉及到节点颜色的变化及部分节点的旋转.关于节点的旋转,以及添加时的处理我们已经介绍完了,所以本文重点介绍红黑树的删除. 二.红黑树的特点 在介绍删除时,我们还是再来回顾一下红黑树的五个特点,如下: 1)节点的颜色是红色或者黑色 2)树的根节点为黑色 3)树的叶子节点为黑色 4)如果一

红黑树(一)之 原理和算法详细介绍---转帖

目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 作者:Sky Wang    于 2013-08-08 概述:R-B Tree,又称为"红黑树".本文参考了<算法导论>中红黑树相关知识,加之自己的理解,然后以图文的形式对红黑树进行说明.本文的主要内容包括:红黑树的特性,红黑树的时间复杂度和它的证明,红黑树的左旋.右旋.插入.删除等操作. 请尊重版权,转

【转】红黑树(一)原理与算法详细介绍

讲的通俗易懂,忍不住内心的欢喜,独乐乐不如众乐乐,下面贴出博文及地址: 概要 目录1 红黑树的介绍2 红黑树的应用3 红黑树的时间复杂度和相关证明4 红黑树的基本操作(一) 左旋和右旋5 红黑树的基本操作(二) 添加6 红黑树的基本操作(三) 删除 [转]  作者:Sky Wang :http://www.cnblogs.com/skywang12345/p/3245399.html 更多内容: 数据结构与算法系列 目录 (01) 红黑树(一)之 原理和算法详细介绍(02) 红黑树(二)之 C语

红黑树的插入

一.红黑树的介绍 先来看下算法导论对R-B Tree的介绍: 红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black.通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的. 前面说了,红黑树,是一种二叉查找树,既然是二叉查找树,那么它必满足二叉查找树的一般性质.下面,在具体介绍红黑树之前,咱们先来了解下 二叉查找树的一般性质:1.在一棵二叉查找树上,执行查找.插入.删除等操作,的时间复杂度为O(

木马程序猿学习笔记——红黑树解析3

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 六.树的前序.中序.后序 前序遍历(根左右): 1.訪问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历(左根右): 1.中序遍历左子树 2.訪问根节点 3.中序遍历右子树 后序遍历(左右根): 1.后序遍历左子树 2.后序遍历右子树 3.訪问根节点 扩展:已知前序.中序遍历,求后序遍历? 例: 前序遍历: GDAFEMHZ 中序遍历:

红黑树(3) - 删除操作

在本系列的前面两篇文章中,已经介绍了红黑树以及其插入操作.具体可参考下面两个链接: 红黑树(1) - 介绍 红黑树(2) - 插入操作 1.删除操作介绍 类似于插入操作,红黑树进行删除节点时,也使用重新着色以及旋转这两种方式,来维护它的属性.在插入操作中,我们主要是依靠检测叔节点的颜色来决定哪种场景.在删除操作中,我们使用检测兄弟的颜色,来决定是哪种场景. 在插入操作中,最常见的违反红黑树属性的一种情况是存在两个连续的红色节点.而在删除操作中,常见的情况是,当删除节点是黑色时,会影响从根节点到叶