11082 完全二叉树的种类

时间限制:800MS  内存限制:1000K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

Description

构造n个(2<=n<=20)叶结点的的完全二叉树(完全二叉树意味着每个分支结点都有2个儿子结点),有多少种构造方法?

注意:不改变n个结点的相对顺序,左右儿子不调换.

例如:
4个叶子节点A1,A2,A3,A4,可构造出如下完全二叉树,共5种。

再例如:5个叶子结点,A1,A2,A3,A4,A5,可构造出如下若干种完全二叉树形状,像这样的完全二叉树共有14种(下图
并未全部列出)。

输入格式

输入n,表示构造的完全二叉树有n个叶结点(2<=n<=20)。

输出格式

输出构造的完全二叉树的种类。

输入样例

5

输出样例

14

提示

作者

zhengchan  

  

  题解:

  首先看一般的递推公式:题目规定是构造完全二叉树,那么不论怎么构造,根节点的左子树和右子树也都是完全二叉树。那么含有n个叶子的完全二叉树的构造方案数就等于左子树的方案数乘以右子树的方案数。列举所有左右子树的分布情况;得到公式f(n)=f(1)f(n-1)+f(2)f(n-2)+...+f(i)f(n-i)+...+f(n-1)f(1). 复杂度为O(n^2),不仅复杂度不低,而且实现较复杂,递归时还得用额外的空间记录已经计算过的值。

  现在从另一个角度分析。先假设取一个最小结点单位(即一个结点下接两个叶子)。 然后构造一棵含有n-1个叶子的完全二叉树;再将刚提到的最下结点单位替换n-1个叶子中的任何一个,就是一棵含有n个叶子的完全二叉树,这种情况的方案数为f(2)f(n-1)*(n-1)。 以此类推所有情况可得出n个叶子的完全二叉树方案数有:f(2)f(n-1)*(n-1)+f(3)f(n-2)*(n-2)+...+f(i)f(n-i+1)*(n-i+1)+...+f(n-1)f(2)*2。 把首尾合并得:f(2)f(n-1)*(n+1)+f(3)f(n-2)*(n+1)+...+f(i)f(n-i+1)*(n+1) | i<=n/2.  但这并不是正确的f(n)公式,因为没有去除重复的情况。 在n>3时这个式子是一定只有n-2项的(指没首尾合并前),而每一项的情况都会在其他的n-3项中重复一次(如果不清楚可以实际画f(4)或f(5)的情况看下)。 所以要除以重复的n-2。 那么最终得到公式f(n)=[f(2)f(n-1)+f(3)f(n-2)+...+f(i)f(n-i+1)]*(n+1)/(n-2) | i<=n/2。

  现在看会最开始的那个公式,将n+1代入得:f(n+1)=f(1)f(n)+f(2)f(n-1)+...+f(i)f(n-i+1)+...f(n)f(1)。 去掉首尾的f(1)f(n)和f(n)f(1)。中间的这个式子,正好就是后面推的f(n)公式大括号部分的“一半”。将该部分乘以二则有f(2)f(n-1)+...+f(i)f(n-i+1)+...+f(n-1)f(2)=f(n)*2(n-2)/(n+1)。  由f(1)=1,所以f(n+1)=2f(n)+f(n)*2(n-2)/(n+1).  最后化简得到公式f(n)=f(n-1)*(4n-6)/n.

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
using namespace std;
typedef long long ll; ll catalan(int n)
{
if(n==)return ;
return catalan(n-)*(*n-)/n;
}
int main()
{
int n;
scanf("%d",&n);
printf("%lld\n",catalan(n));
return ;
}

最新文章

  1. WCF的Restful和TCP方式调用性能比较
  2. Object.assign()方法
  3. 我的c漏洞
  4. JAVA基础知识之IO-File类
  5. WP8.1 Study12:文件压缩与Known Folder(包含SD卡操作)
  6. webbrowser在不同的.netframework版本差异
  7. Linux 下配置网卡的别名即网卡子IP的配置 转
  8. android源码编译1
  9. FileZilla Server下载以及安装使用
  10. ffmpeg在Win7 VS2010中debug通过,release出错的问题解决方法
  11. perl中的pack与unpack
  12. tensorflow笔记(三)之 tensorboard的使用
  13. hdu3016 线段树+简单DP
  14. phpstudy等php本地环境运行缓慢的问题解决方法
  15. luanet更名为distri.lua
  16. [Robot Framework] 学习资料
  17. SWIFT 之CoreData初试
  18. beanUtils的用法
  19. modelsim仿真中 do文件的写法技巧
  20. 牛客网Java刷题知识点之进程和线程的区别

热门文章

  1. Android 比SwipeRefreshLayout更漂亮和强大的下拉刷新控件:Android-MaterialRefreshLayout
  2. 开发一款APP需要多少钱
  3. Java 基础入门随笔(7) JavaSE版——面向对象定义、特征:封装、构造函数
  4. Codeforces_750_C_(二分查找)
  5. 创建一个 Vue 的实例
  6. CAD得到多行文本(com接口VB语言)
  7. CAD控件:梦想CAD控件功能更新 清除图上的所有高亮实体
  8. Spring框架系列(六)--事务Transaction
  9. Django - 模版之继承
  10. mac os 10.10解决pod问题