求节点数为n的AVL树的种数

该博客介绍了如何计算节点数为n的AVL树的不同形态数量,涉及动态规划的解题思路及具体代码实现。
摘要由CSDN通过智能技术生成

题目

51nod上的一道题,求节点数为n(n<=2000)的不同形态的AVL树有多少种,结果对10^9+7取模。

解法

设dp[i][j]是节点数为i,高度为j的AVL树的数量,则树的左右子树的高度只有3种可能,分别是(j-1,j-1),(j-1,j-2),(j-2,j-1),所以枚举x为左子树的节点数,y为右子树的节点数,h为左子树的节点数,dp[i][j]+=dp[h][x]*dp[i-h-1][y];

代码

#include<cstdio>
#define LL long long
#define mod 1000000007
LL dp[2005][20];
int mi[20],ma[20],dir[5][2]={-1,-1,-1,-2,-2,-1};
int main()
{
	int n,i,j,k,h;
	//ma[i]是高度为i的AVL树的最大节点数
	ma[1]=1;
	for(i=2;i<=20;i++)
		ma[i]=ma[i-1]*2+1;
	//mi[i]是高度为i的AVL树的最小节点数
	mi[1]=1;mi[2]=2;
	for(i=3;i<=20;i++)
		mi[i]=mi[i-1]+mi[i-2]+1;
	dp[1][1]=1;dp[2][2]=2;
	for(i=3;i<=2000;i++)
		for(j=1;j<=20;j++)
		{
			if(i<mi[j]||i>ma[j])
				continue;
			for(k=0;k<3;k+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值