当给定高度为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
答案 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;
}
}