AVL树的最少节点数

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

AVL树的最少节点数

今天考试数据结构考试前有这么道题:

高为h 的AVL(平衡二叉树)至少有几个节点。

但是可是给我难住了,当时真是眼前一蒙,但是自己还是迎着头皮钻研了一下,做出来了结果

首先,avl树的节点个数怎么计算

第一我们画出来一层的也就是只有一个节点

然后画出来两层的两个节点

以上都是至少所以后来我们计算有三层的时候,可以增加一个节点A,A的左子树就是两层的至少得情况右子树就是一层的情况,这样全部就是平衡的情况,而且数目最少,同时还满足平衡二叉树的条件:即左右子树的高度差不超过1.

这样我们得到了递推公式

A(n+2)=A(n+1)+A(n)+1; 1式

A(n+3)=A(n+2)+A(n+1)+1; 2式

数学里面学过特征根方程在数列求解递推公式和求解时候用到

这里就不再赘述了,高中数学知识

2式减1式,得出来

B(n+2)=B(n+1)+B(n);就是著名的斐波那契数列最后求得就是这个东西而A(n+1)-A(n)=B(n);就是说在求出来A就好了

根据特征根的有

x2=x+1

求出来的特征根满足

B n=sa1n+Ta2n

这时,带入b1=1,b2=2

得到结果是s=√5

5+√5

然后求得A时候有

A n−A n−1=

B n−1

A n−1−A n−2=

B n−2

A2−A1=B1

叠加起来就是对左边求和

A=

√5

5+√5

1−(

1+√5

2)

n−1

1−

1+√5

2

√5

5−√5

1−(

1−√5

2)

n−1

1−

1−√5

2

1

在这里求和结果就不再化简了

这里就是对结果进行了计算机的模拟贴出来模拟结果如下只显示前10项

这个结果在百度维基百科上面也能查到,就是斐波那契数列的后一项减去1写出我们写的斐波那契数列结果

√5 5+√5×(

1+√5

2

)

n+1

+

√5

5−√5

×(

1−√5

2

)

n+1

−1

附代码如下(C++)

#include

#include

using namespace std;

const long double g=sqrt((long double)5);//表示根号5const long double S=(3+g)/(5+g);

const long double T=(3-g)/(5-g);

const long double a1=(1+g)/2;

const long double a2=(1-g)/2;

long double Bn(int n){

long double aaa,bbb;

aaa=pow(a1,(long double)n);

bbb=pow(a2,(long double)n);

return S*aaa+T*bbb;

}

long double An(int n){

long double aaa,bbb;

aaa=(1-pow(a1,(long double)n-1))/(1-a1);

bbb=(1-pow(a2,(long double)n-1))/(1-a2);

return S*aaa*a1+T*bbb*a2+1;

}

int main(){

for (int i=1;i<11;i++)//控制输出的数据个数

{

cout<

}

cout<

for (int i=1;i<11;i++)

{

cout<

}

cout<

}

相关文档
最新文档