前言
关于红黑树的高度证明,看了下维基百科里面关于渐近边界的证明有点懵逼。觉得证明的过程有点曲折,不知道是翻译的缘故,还是本来就难以理解。
所以我尝试使用简单的,通俗并且易于理解的方式一步一步的推导。
正文
包含n个内部节点的红黑树的高度是O(log(n))。
定义:
- h(v)表示以节点v为根的子树的高度。
- bh(v)表示从到v子树中任何叶子的黑色节点的数目(如果v是黑色则不计数它,也叫做黑色高度)。
引理:以节点v为根的子树有至少2bh(v)−1个内部节点。
定义和引理沿用的是wiki中的,下面会开始证明。
在h(v)=0的时候,表示树的高度为0,此时bh(v)=0,所以:
2bh(v)−1=20−1=0
然后就需要使用归纳演绎了,假设以节点v为根的子树有至少2bh(v)−1内部节点,此时h(v)=k。
那么在h(v′)=k+1的时候,bh(v′)−1=bh(v)或者bh(v′)=bh(v),因为树的高度加一,那么黑高可能不变或者加一。
对于h(v′)树种的节点数就满足n>=2bh(v)−1+2bh(v)−1+1=2bh(v)+1−1。把bh(v)用bh(v′)替换,结果就是n>=2bh(v′)+1−1或者n>=2bh(v′)−1。n的下限取最小值的话就是 2bh(v′)−1,然后就由k成立推导了k+1也成立,引理得证。
证明
由于红黑树的性质可以得知,红色节点必有两个黑色的子节点。也就是说存在红色节点的情况下,必存在对应的黑色子节点,而存在黑色节点的时候,没有和红色节点的必然关系。那么红黑树中的bh(root)>=2h(root),再和证明了的引理结合就可以完成下面一步一步的推导了
n>=22h(root)−1 -> log(n+1)>=2h(root) -> h(root)<=2log(n+1)
最后就可以确定后红黑树中查询的时间复杂度为log(n)