文章目录
- 题目描述
- 代码 & 思路
- 精简版 2.0
题目描述
- 这道题其实不用构造数据结构
- 二叉搜索树:只要利用这个结构的性质即可,即:左右两子,左小右大
- 然后用动态规划来做,具体如何推导见思路部分
代码 & 思路
- 见注释
class Solution {public int numTrees(int n) {// G(n)代表1~n组成的二叉搜索树种类// f(i)代表i为root的n个结点二叉搜索树// 那么有G(n) = f(1) + f(2) + ... + f(n)// 又f(i) = G(i-1) * G(n-i),也就是左边种类数量 * 右边种类数量// dp[i] 就是 G[i],就是以i个结点组成的树的种类数量int[] dp = new int[n+1];// 众所周知,0个和1个的数量都是1dp[0] = 1;dp[1] = 1;// i代表i个结点,从2个开始算,n个结束// 每次得到一个G[i]for(int i=2;i < n+1;i++){// f(i) = G(i-1) * G(n-i),一次j循环加一个f(i)for(int j=1;j < i+1;j++){// 此处的 i 就是当前 n// 二叉树的性质在这体现dp[i] += dp[j-1] * dp[i-j]; }}return dp[n];}
}
精简版 2.0
class Solution {public int numTrees(int n) {int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for(int i = 2; i <= n; i++) {for(int j = 1; j <= i; j++) {dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];}
}