在复习红黑树的特性时,产生了这样的一个疑问,红黑树的高度是多少呢?在Java8,HashMap所使用的拉链法散列表中,如果储存元素的键值与原来储存元素的键值发生了Hash冲突,如果val值不一样,会将该元素存放在红黑树的数据结构中。
红黑树查找一个元素所需要的时间最坏是2lgN,插入一个元素最坏情况所需要的时间是2lgN,查找命中所需要的平均时间是lgN,插入一个元素所需要的平均时间也是lgN.首先,说一说红黑树的特性:
(1)红黑树的根节点是黑色的
(2)红节点都出现在左链接中
(3)不可以出现连续两个红色的左连接
(4)红黑树是完美黑色平衡的,即任意空连接到根节点的路径上的黑连接数量相同。
其实(2)(3)两点可以归纳成一个点:一个红色节点的左右两个子节点必定是黑色的。
二,红黑树为什么能保证各项基本操作的时间复杂度为对数级O(logN)
现在来证明为什么红黑树的高度是logN级别的。
证明:一棵有 n 个内结点的红黑树的高度至多是 2log(n+1),只需要证明它的逆否命题高度为h的红黑树,节点个数最少是2^(h/2)-1;
叶结点:数据域为NIL的结点。内结点(非叶结点):数据域不为NIL的结点。红黑树中每个结点有五个域(字段):①颜色 ②数据域(key) ③左指针 ④右指针 ⑤父结点指针
首先定义一个黑高度概念:从某个结点 x 出发,到达一个叶结点的任意一条路径上,黑色结点的个数 称为黑高度。记为 bh(x)
其次,假设红黑树的高度为h(根结点的高度为0),由性质(2)(3)可知:从根结点(不包括根)到叶结点的任一简单路径上至少有一半的结点是黑色的,从而根的黑高度至少是 h/2。因此我们只需要证明黑高度为bh(x)的红黑树,节点至少为2^(bh(x))-1个。
根据数学归纳法证明
O(1)当黑高度为0 时,节点个数最少为 0
O (2) 当黑高度为1时,节点个数至少为1
O(h-1)当黑高度为h-1时,节点个数至少为2^(h-1)-1
证明:当红黑树Tree黑高度为h时,节点个数至少为2^(bh(x))-1,Tree的左子树的黑高度为h-1,Tree的右子树的黑高度为h-1,根据特性(4)得出,根据O(h-1)左子树的节点个数至少为 2^(h-1)-1个,右子树的节点个数至少为2^(h-1)-1个,所以该红黑树的节点个数至少为2^(h-1)-1+2^(h-1)-1+1=2^(h)-1.。
从而有: n >= 2^(h/2) -1, 得出 h <= 2log(n+1),从而证明了红黑树的高度是O(logN)。