红黑树(1) - 介绍

原创 2015年07月08日 00:42:21

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

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

算法导论笔记 红黑树(1)

// //  RB_tree.cpp //  笔记 // //  Created by fam on 15/3/17. // // ...
  • boydfd
  • boydfd
  • 2015年03月18日 22:49
  • 558

红黑树 学习概要(1)

一、什么是红黑树 R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。...

理解红黑树(1)

红黑树是一种二叉查找树,它是在1972年由Rudolf Bayer发明的,它的性能优于平衡2叉树(avl树),因为avl树过分追求平衡,avl树要求任何节点的左右子树高度之差不能大于1,而红黑树做到的...

红黑树的C++实现(1)

三年前磕磕盼盼用C语言写过红黑树,这段时间用C++重写了红黑树,修复了之前代码中的一些错误。记得以前的博客里面就写过使用C++写红黑树更容易些,因为可以重用二叉搜索树的C++代码。照例,首先实现二叉搜...

树——(1)综述:二叉树,线索二叉树,二叉搜索树,B-/B+树,AVL树,红黑树

tree 1. 定义 树是n(n>=0)个结点的有限集。在任意一棵非空树中:     (1)有且仅有一个特定的称为根的结点;    (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1...

平衡查找树——2-3查找树——红黑树(1)

二叉查找树VS平衡查找树Binary Search Tree possibilitiesBalanced Search Trees如何学 平衡查找树为了保证之前学习的二分查找树BST的平衡性,解决在最...

用户空间使用Linux数据结构系列之红黑树(1)

用户空间使用Linux数据结构系列之红黑树          本文通过对Linux内核中红黑树的源码分析,通过大量图示描述红黑树的原理,最后通过移植改造Linux内核红黑树代码,使用户空间也能使...

彻底明白红黑树(1)

一、红黑树的介绍 先来看下算法导论对R-B Tree的介绍: 红黑树,一种二叉查找树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:红黑树(1) - 介绍
举报原因:
原因补充:

(最多只允许输入30个字)