AVL树中的最小节点数?

时间:2014-01-25 05:47:11

标签: java avl-tree

我知道在AVL树中找到最小节点数的公式是

S(h) = S(h-1) + S(h-2) + 1

但是,我真的不知道如何使用这个函数,比如我们的AVL高度为6。 答案告诉我,最小= 7 + 4 + 1 = 12。但你怎么得到这个数字?我的意思是当你插入6不是它(6-1)+(6-2)+ 1?

任何人都可以向我解释如何解决这个问题吗?我的老师还没有谈到这个,但我真的想自己弄清楚这一点,以便为下周的测试做好准备。

7 个答案:

答案 0 :(得分:12)

S(h) = S(h-1) + S(h-2) + 1

S(h)recursive function/formula。递归函数在其体内调用自身(以更小或更简单的方式)。

请注意,递归函数必须具有一些基本情况,在这种情况下:

S(1) = 0
S(2) = 1

让我们说h = 6,然后S(h = 6)将会(只是替换):

S(6) = S(6-1) + S(6-2) + 1
S(6) = S(5) + S(4) + 1 
S(6) = 2*S(4) + S(3) + 1 + 1
S(6) = 2*(S(3) + S(2) + 1) + S(3) + 2
S(6) = 3*S(3) + 2*S(2) + 4
S(6) = 3*(S(2) + S(1) + 1) + 2*S(2) + 4
S(6) = 5*S(2) + 3*S(1) + 7
S(6) = 5*1 + 3*0 + 7
S(6) = 12

答案 1 :(得分:3)

对于高度为6的树,AVL树中的最小节点数不是20,它应该是33.下面的等式应该演示N(h)函数的递归调用。

由于我们知道N(0)= 1,N(1)= 2,N(2)= 4,我们可以将以下等式减少到h = 6的这些知识。

式N(h)= 1 + N(h-1)+ N(h-2)

N(3)= 1 + N(3-1)+ N(3-2)= 1 + N(2)+ N(1)= 7

N(4)= 1 + N(4-1)+ N(4-2)= 1 + N(3)+ N(2)= 12

N(5)= 1 + N(5-1)+ N(5-2)= 1 + N(4)+ N(3)= 20

N(6)= 1 + N(6-1)+ N(6-2)= 1 + N(5)+ N(4)= 33

我希望这可以帮到你

答案 2 :(得分:2)

函数N(h)= 1 + N(h - 1)+ N(h - 2)

麻省理工学院复习04指出这个递归函数的基本情况是: N(1)= 1; N(2)= 2

因此

N(3)= 1 + N(2)+ N(1)= 1 + 2 + 1 = 4

N(4)= 1 + N(3)+ N(2)= 1 + 4 + 2 = 7

N(5)= 1 + N(4)+ N(3)= 1 + 7 + 4 = 12

N(6)= 1 + N(5)+ N(4)= 1 + 12 + 7 = 20

N(7)= 1 + N(6)+ N(5)= 1 + 20 + 12 = 33

N(8)= 1 + N(7)+ N(6)= 1 + 33 + 20 = 54

依此类推,只需从以前的答案中插入数字......

https://courses.csail.mit.edu/6.006/spring11/rec/rec04.pdf

答案 3 :(得分:1)

对上述问题的快速说明,对于高度为6的树,AVL树中的最小节点数不是12,它应该是20.下面的等式应该演示S的递归调用( h)功能。

因为我们知道S(1)= 1,S(2)= 2,& S(3)= 4,我们可以将以下等式减少到这些已知的h = 6。

S(h) = S(h-1) + S(h-2) + 1
S(6) = S(5) + S(4) + 1                           // recursive S(5) & S(4)
S(6) = (S(4) + S(3) + 1) + (S(3) + S(2) + 1) + 1 // don't forget '+1'
S(6) = [(S(3) + S(2) + 1) + S(3) + 1] + (S(3) + S(2) + 1) + 1

// now sub in the values
S(6) = [(4 + 2 + 1) + 4 + 1] + (4 + 2 + 1) + 1
S(6) = 4 + 2 + 1 + 4 + 1 + 4 + 2 + 1 + 1
S(6) = 20

我希望这会有所帮助。如果我忽视某些事情,请告诉我!

答案 4 :(得分:0)

您将S(h-1)S(h)-1混淆,第一个是高度为h-1的树的(最小)尺寸,第二个是高度为{{1}的树的大小然后然后从中减去一个。

答案 5 :(得分:0)

以两种方式使用Fibonacci序列: 第一种方式不那么复杂,但效率不如第二种方式。为了理解第二种方式你需要知道一些数学,我不会在这里解释,除非你真的希望它或检查维基的一些答案 第一种方式:

public int findMinNodes(int h){
   if(h<0)
      return 0;
   int a=1;
   int b=2;
   int c;
   for(int i=1;i<h;i++){
      c=a+b+1;
      a=b;
      b=c;
      }
   return b;
}
第二种方式:

public static int findMinNodes(int h){
       return (int)(Math.round(((Math.sqrt(5)+2)/
            Math.sqrt(5))*Math.pow((1+
            Math.sqrt(5))/2,h)-1));
        }

注意:如果您尝试使用非常大的输入(例如h = 6000)的第二种方法,您的答案将显示由数学方法引起的“无穷大”。

答案 6 :(得分:0)

高度为h的avl树中的最小节点是平衡因子为1或-1的时间。 在那种avl树 一个子树的高度为h-1,其他子树的高度为h-2。 因此,我们计算不。高度为h-1和h-2的树的节点递归并加1。 添加1以计算前一树的根节点。