红黑树(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]个黑色节点。
结论3:在红黑树中若x仅仅有一棵非空子树,则x必为黑色。
与x仅仅有一棵非空子树矛盾。
结论4:在红黑树中若x仅仅有一棵非空子树。则该非空子树的根必为红色,且该非空子树仅且仅仅有一个根节点。
从x到经过y到各叶节点的路径上的黑色节点数大于到右子树叶节点路径上的黑色节点数。
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
本系列的兴许文章会介绍插入以及删除等操作。