AVL树最大和最小节点

时间:2014-09-06 15:50:52

标签: java recursion

当给定高度为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

2 个答案:

答案 0 :(得分:1)

对于AVL树中的每个节点,我们知道左侧和右侧子树的深度最多相差1(这由定义给出)。

由此,下一步非常明显:我们采用深度为N和N-1的最小树,并将它们作为新根的子树。很明显,AVL规则仍然存在,并且树包含尽可能少的节点(显然来自归纳基础情况)。

由此,我们得到了递归公式:minnodes(深度)= 1 + minnodes(深度-1)+ minnodes(深度-2)。这是一个简单的递归方程式,Wolfram Alpha可以为您解决(link)。

第二种情况是微不足道的 - 深度为h的完美二叉树包含尽可能多的节点,用于给定的深度并且平凡地满足AVL条件。

答案 1 :(得分:0)

你错误地计算了某个地方的一个步骤,看起来接近结束:

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;
    }
}