目录
1.红黑树性质
红黑树是一种自平衡二叉查找树(BST),其中的每个节点都遵守下面的规则:
性质1 - 节点是红色或黑色
性质2 - 根节点是黑色
性质3 - 所有叶子都是黑色(叶子是下图中的NIL节点,注意不是下图中的5,22,27这些节点)
性质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
本系列的后续文章会介绍插入以及删除等操作。