给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \
3 2 1 1 3 2
/ / \ \
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/unique-binary-search-trees
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public:
int numTrees(int n) {
int c=1;
for(int i=1;i<n;i++)
{
c=2*(2*i+1)*c/(i+2);//(记得把i+2括号括起来)
}
}
return c;
};
这玩意是个公式!!!!!!
叫做
明安图公式!!也叫卡塔兰算法!
上公式!
第一行是最初推理得到得公式,,最后是经过化简得到的
附上公式的证明
最适合理解的模型
n个0和n个1组成一个2n位的2进制数,要求从左到右扫描时,0的累计数始终都小于等于1的累计数,求满足条件的数有多少?
观察模型 (6):在2n位上填入n个0的方案数为 。而从 中减去不符合要求的方案数即为所求答案。
在从左往右扫时,必然会在某一个奇数位2p+1上首先出现p+1个1,和p个0
此后的 [2p+2,2n]上的2n−(2p+1)位有n−p个0, n−p−1个1。如若把后面这部分2n−(2p+1)位的1与0互换,使之成为n−p个1,n−p−1个0,结果得1个由n+1个1和n−1个0组成的2n位数,即一个不合法的方案必定对应着一个由n+1个1和n-1个0组成的一个排列。
可以倒过来反证:
任意一个由n+1个1和n-1个0组成的一个排列,由于1的个数多了2个,且2n为偶数,所以必定在某个奇数位2p+1上出现1的个数超过0的个数。同样把后面部分1和0互换,成为了由n个0和n个1组成的2n位数。
由此,每一个不合法的方案总是与唯一一个由n+1个1和n−1个0组成的排列一一对应。
于是,不合法的方案数就可以写作:
例如 10100101
是由4个0和4个1组成的8位2进制数。但从左而右扫描在第5位(显示为红色)出现0的累计数3超过1的累计数2,它对应于由3个1,5个0组成的10100010。
反过来 10100010
对应于 10100101
因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应,故有“卡塔兰数”Catalan
附上原文链接
https://baike.baidu.com/item/catalan/7605685?fr=aladdin
对于把2p+1后的2n-2p-1位数转换一下我一直无法理解,后来经过兵哥哥的画图,,,才明白
还有许多类似的题目也可以用这种做法,似乎他们都有一些共同的特点。比如只有两种选择可以选
附上一些其他的应用
https://www.cnblogs.com/lsyyy/p/11536606.html
具体是怎样的明晚再深究
另外,这题还可以用动态规划来做,可惜现在还不会,等学完再来做