簡體   English   中英

AVL樹的最大和最小節點

[英]AVL Tree max and min node

給定高度為8時,如何獲取AVL樹中的最大和最小節點數。

我似乎無法從公式f(8)= f(7)+ f(6)+1正確地找到它

2*f(6)+f(5)+2
2*[f(5)+f(4)+1]+f(5)+2
3*f(5)+2*f4+4
3*[f(4)+f(3)+1]+2*f(4)+4
5*f(4)+3*f(3)+7
5*[f(3)+f(2)+1]+3*f(3)+7
8*f(3)+5*f(2)+12
8*[f(2)+f(1)+1]+5*f(2)+12
13*f(2)+8*f(1)+20
13*[f(1)+f(0)+1]+8*f(1)+20
21*f(1)+13*f(0)+33=54 whereas answer is 88 is the minimum

對於AVL樹中的每個節點,我們知道左子樹和右子樹的深度最多相差1(由定義給出)。

由此可見,下一步非常明顯:我們選取深度為N和N-1的最小樹並將其作為新根的子樹。 顯然,AVL規則仍然成立,並且樹包含盡可能少的節點(從歸納基本案例中可以明顯看出)。

由此,我們得到了遞歸公式:minnodes(depth)= 1 + minnodes(depth-1)+ minnodes(depth-2)。 那是一個簡單的遞歸方程,Wolfram Alpha可以為您解決這個問題( 鏈接 )。

第二種情況是微不足道的-深度為h的完美二叉樹包含給定深度的盡可能多的節點,並且滿足AVL條件。

您在某個地方計算了錯誤的步驟,看起來快要結束了:

f(0) = 1
f(1) = 2
f(2) = f(1) + f(0) + 1 = 4
f(3) = f(2) + f(1) + 1 = 4 + 2 + 1 = 7
f(4) = f(3) + f(2) + 1 = 7 + 4 + 1 = 12
f(5) = f(4) + f(3) + 1 = 12 + 7 + 1 = 20
f(6) = f(5) + f(4) + 1 = 20 + 12 + 1 = 34
f(7) = f(6) + f(5) + 1 = 34 + 20 + 1 = 55
f(8) = f(7) + f(6) + 1 = 55 + 34 + 1 = 88

而且,如果您不相信它,可以隨時制作一個簡短的代碼段進行檢查:

@Test
public void testGetMax() {
    assertEquals(88, getMax(8));
}

int getMax(int x) {
    switch (x) {
        case 0:
            return 1;
        case 1:
            return 2;
        default:
            return getMax(x - 1) + getMax(x - 2) + 1;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM