红黑树最大高度

红黑树最大树高的更准确估计

Posted by Kylin on December 14, 2023

[TOC]

Definition

这里红黑树相关定义沿用的是邓公版数据结构中的定义:

  • 树高:从根节点到叶节点路径长(空树树高-1,单节点树树高0)

  • 红黑树树高:从根节点到外部节点的路径长

Proof

查阅了一圈网上的资料,发现对于红黑树树高的证明只有一个相对较宽松的上界:

设内部节点为n,外部节点为n+1,那么黑高度 bh 满足 bh<=lg(n+1)

故最大高度 h<=2lg(n+1)

但是带入一个例子就可以发现这个上界太高了,比如n=1

所以我们希望找一个真实的最大树高度。

首先我们知道红黑树等价于(2,4)-B树1,那现在其实可以考虑,对于高为h的红黑树,至少有多少个节点。

那将此时节点最少化的红黑树转化为B树之后有两种情况,就是h是否为偶数:

1)h是偶数时,为了能达到树高h至少有一条路径上要增加h/2个红点:

可以计算此时总节点数(内部+外部): \(N = (2+4+8+...+2^{h/2+1})-1=2^{h/2+2}-3\) 当然也可以转为内部节点表达: \(n=2^{h/2+1}-2\) 则此时最小树高为: \(h_{max} = 2*(\lfloor{log_2(n+2)}\rfloor-1)\) 716513c4b3c024e2652bc9f18b8124c

2)h是奇数时,其实就是在根上再接一个黑根,左子树为满黑树(默认最长路径是最右藤)

还是一样,计算此时总节点数(内部+外部): \(N = (2+4+8+...+2^{(h+1)/2}) + 2^{(h+1)/2} - 1 = 3*2^{(h+1)/2}-3\) 转为内部节点表达: \(n =3*2^{(h-1)/2}-2\) 则此时最小树高为: \(h_{max} = 2(\lfloor{log_2((n+2)/3)}\rfloor+1)\) 1b92560e541b34afaa7e95c5d6d4806

最终表达式

综上,只需要在两种情况中取最大即是最大树高: \(h_{max} = max(2*(\lfloor{log_2(n+2)}\rfloor-1),2(\lfloor{log_2((n+2)/3)}\rfloor+1))\) 其中 n 为内部节点数。

Reference

  1. 邓俊辉.数据结构:C++语言版.第2版[M].清华大学出版社,2012.