该算法是这样工作的:如果我正在查看的树不存在,则树的长度为 0。
否则,树的长度是我拥有的两个子树的最大高度加 1(需要加 1 才能包括您当前正在查看的节点)。
例如,如果我有一棵没有树枝的树(即树桩),那么我的高度为 1,因为我有两个高度为 0 的子树,并且这些高度加 1 的最大值为 1。
另一个例子:如果我有一棵树:
A - B - C - D
| |
E F
(其中 a 是根)
那么,高度不为 0,因为 A 不为空
高度 = 最大值(高度(左),高度(右)) + 1。
在 A 的左边高度为 0,因为 A 没有左分支。
右分支的高度是 B + 1 的高度。
为了计算 B 的高度,我们将 B 视为一棵全新的树:
B - C - D
| |
E F
现在高度=最大(高度(左),高度(右))+ 1。
为了计算左的高度,我们将 E 视为一棵全新的树:
E
这个存在所以它的高度不是0
但是,它的两个分支不存在,所以它的高度为 1(每个分支的高度为 0)
再次回到父树:
B - C - D
| |
E F
我们正在计算高度,发现左分支的高度是 1。
所以高度 = max(1, height(right) ) + 1
那么,权利的高度是多少?
再一次,我们将正确的分支视为它自己的树:
C - D
|
F
问题和之前一样 height = max(height(left), height(right)) + 1
为了计算高度(左),我们单独考虑 F
F
F 的高度为 1,因为它有两个空分支(即两个 0 高度加 1 的最大值)
现在看对了
D
出于同样的原因,D 的高度为 1
回到 F 和 D 的父级:
C - D
|
F
C的高度是:
最大(高度(F),高度(D))+ 1
= 最大值(1, 1) + 1
= 1 + 1
= 2。
所以现在我们知道了 C 的高度,我们可以回到父级:
B - C - D
| |
E F
回想一下,我们计算出 B 左分支的长度为 1,然后开始计算它的右分支高度。
我们现在知道右分支的高度为 2
Max(1, 2) 为 2。
2 + 1 = 3
因此,B 的高度为 3。
现在我们知道了这一点,我们终于回到了原来的树:
A - B - C - D
| |
E F
我们已经计算出左侧分支的高度为 0,然后开始处理右侧分支。
我们现在知道右分支的高度为 3。
因此,height(a) = Max(height(null), Max(height(B)) = Max( 0 , 3 ) + 1 = 3+1 =4
完毕。A的高度是4。