给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
这道题仔细想其实很简单的。首先我们先得明白什么是二叉搜索树,二叉搜索树又称二叉查找树,二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,
则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树解决这道题用两个函数
1. G(n); 表示给定整数n的二叉搜索树的长度。其中G(0)=G(1)=1;
2. F(i,n); 表示以i为根节点,数列长度为n的数列能构成不同二叉树的个数; 因为一个数列,如果它的根节点确定了,那么能构成它的不同二叉搜索树的左右节点个数也就确定了。G(n)= F(1,n)+F(2,n)+...+F(n,n)。例如求G(8),其中一个以3为根节点的数列其左子树数为G(3-1);右子树数为4,5,6,7,8,
右子树的算法情况与1,2,3,4,5是一样的,所以右子树个数为G(n-3),可得F(i,n)=G(i-1)*G(n-i);所以G(n)=G(0)*G(n-1)+...+G(n-1)*G(0);由此可看出其实这个G(n)就是卡特兰数,关于卡特兰数具体特点,如果不太了解
可以搜索研究一下 。所以有两个算法。
算法一:动态规则
public class Solution {
public int numTrees(int n) {
int[] G = new int[n + 1];
G[0] = 1;
G[1] = 1; for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
G[i] += G[j - 1] * G[i - j];
}
}
return G[n];
}
}
算法二:利用数学公式

G(0)=G(1)=1;   G(n+1)=2(2n+1)G(n)/(n+2)

class Solution {
public:
int numTrees(int n) {
long G = 1;
for(int i = 0; i < n; i++)
G= G * 2 * (2 * i + 1) /(i + 2);
return G;
}
};

最新文章

  1. MySQL5.7 error log时间显示问题
  2. WebForm Repeater Response以及 地址栏
  3. 8.openssl req
  4. 减小服务器负担,Apache启用mod_expires模块
  5. Linq------各种查询语句大全
  6. 字符集与编码01--charset vs encoding
  7. PPP模式下的融资结构优化
  8. PHPExcel 是用来操作Office Excel 文档的一个PHP类库
  9. SGU107——987654321 problem
  10. VS2010中更改项目名称(转载)
  11. 认识CLR [《CLR via C#》读书笔记]
  12. C++的拷贝构造函数、operator=运算符重载,深拷贝和浅拷贝、explicit关键字
  13. leetcode — path-sum-ii
  14. iptables限制连接数(如sftp) 以及 谨防CC/DDOS攻击的配置 ( connlimit模块)
  15. Educational Codeforces Round 23 B. Makes And The Product
  16. 字节顺序:高位优先(big-endian)和低位优先(little-endian)
  17. Java8学习笔记(六)--Optional
  18. python学习 day1 (3月1日)
  19. 【LOJ】#2079. 「JSOI2016」轻重路径
  20. .net面试题[转载]

热门文章

  1. 提交中文数据乱码问题---web.xml
  2. Spring Boot 默认指标从哪来?
  3. spring security中@PreAuthorize注解的使用
  4. DOM的选择器
  5. 一块钱哪里去了?--java浮点型背后的故事
  6. macbook 安装redis流程及问题总结
  7. Java-手动搭建SSM(Maven)
  8. [python]print简单用法和读取用户输入
  9. LuoGu-P1239计数器-强大的贡献
  10. 天梯杯 L2-008. 最长对称子串