Leetcode:96. 不一样的二叉搜索树编程
题目在连接中,点进去看看吧!数组
先介绍一个名词:卡特兰数spa
卡特兰数Cn知足如下递推关系:
\[ C_{n+1}=C_0C_n+C_1C_{n-1}+...+C_nC_0 \]
有兴趣的同窗点击这里查看亚特兰数的百度百科code
很巧的是,这道题能够利用亚特兰数计算出有多少个不一样的BST。leetcode
class Solution { public: int numTrees(int n) { vector<int> dp(n+2); dp[0]=1; for(int i=1;i<=n;i++){ int temp=i-1; while(temp>=0){ dp[i]+=dp[temp]*dp[i-temp-1]; temp--; } } return dp[n]; } };
这道题利用的是动态规划的思想,递推得出一个dp数组。在找规律的过程当中,咱们意外发现这道题的答案与亚特兰数的数学递推式和dp方程彻底一致!get
前提条件:这是一颗BST树,中序遍历得出的排列等于其升序排列数学
首先,当结点数为0时,树的个数为1it
分析当结点数为1时:io
分析当结点数为2时:class
分析当结点数为3时:
有兴趣能够继续递推,总之总结规律:
\[ dp[k]=\sum_0^{k-1} dp[i]*dp[k-i-1] \]
而后就是编程实现啦~