我确实注意到这个定义比通常的定义更受限制:在标准定义中,要求 5 不存在,红色节点可以是兄弟节点。但是考虑到这个额外的限制,我们可以进行以下分析:
- 唯一黑色高度为 0 的树是空树。
- 唯一黑色高度为 1 的树是单个黑色节点(根和叶)
首先想到的黑色高度为 2 的树如下:
b
/ \
b b
我们可以选择这两个叶子中的一个来扩展为一个带有两个黑色子节点的红色节点:
b
/ \
R b
/ \
b b
我们不能做得更多。没有办法注入第二个红色节点。这棵树的镜像是保持在您列出的约束范围内的唯一其他可能性,并且黑色高度为 2。
此形状是递增到下一个黑色高度 3(或更大)的关键。我将这棵树称为T。
要生成一棵黑色高度为 3 的树,并具有尽可能多的红色节点,我们可以替换每个叶子(有 3 个)为 T时间>。结果是这样的:
_____ b_____
/ \
R b
/ \ / \
b b R b
/ \ / \ / \
R b R b b b
/ \ / \
b b b b
同样,我们可以镜像不同的子树,但是没有办法在黑色高度为 3 的树中获得更多的红色节点。
现在考虑一下:在这个扩展中,我们用 T 替换了每个现有的叶子,并且由于 T 有一个红色节点,我们实际上添加了相同数量的红色节点有叶子。并且由于 T 有 3 个叶子,我们将叶子的数量乘以 3,这将决定我们将在下一次扩展时注入多少 T 树......等等。
这给了我们一个递归关系——我写了 rh 来表示黑色高度树中红色节点的最大数量 h:
- r0 = 0
- r1 = 0
- r2 = 1
- rh = 1 + 3rh-1
在一个直接公式中,最后一个等式变为:
这样的和可以重写为以 3 为基数的 1 位数字的重复,因此我们可以推导出:
这个公式对于 h=1 和 h=2 也给出了正确的结果,所以我们只需要添加 h=0 的情况em>:
- r0 = 0
- rh = (3h-1 - 1) / 2,当 h > 0
这是一个包含前几个结果的表格:
black height (h) | max number of red nodes (r[h])
-----------------+----------------------------------------
0 | 0
1 | 0
2 | 1
3 | 4
4 | 13
5 | 40
6 | 121
7 | 364
8 | 1093
... | ...
h | (3^(h-1) - 1) / 2