LeetCode刷题——96. 不同的二叉搜索树(树 动规)
题目描述
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
分析
这题可以通过枚举每个长度数(i 代表从1~i的连续数组成的不同二叉搜索树的数量,也就是说考虑1~n 和 2 ~ n + 1最后的答案都是一样的,因为连续性,最后组合成的数的形状都是一样的。),然后对这些连续的数枚举其中每个数作为根节点的情况进行讨论,关键就是定位到一个数作为根节点以后,接下来就是怎么算这个数它左右两边的数分别组成二叉搜索树的情况,两者算出来相乘就是以当前数作为根节点的组合方式数。当考虑完所有情况之后,最后的f[n]就是答案。
状态:f[i] 表示1~i 这些连续数能组合成多少种不同的二叉搜索树
初始条件:f[0] = f[1] = 1;
AC代码
1 class Solution { 2 public int numTrees(int n) { 3 if (n == 1) { 4 return 1; 5 } 6 7 int[] dp = new int[n + 1]; 8 9 // 0也是一种方案 10 dp[0] = 1; 11 for (int i = 1; i <= n; i++) { 12 for (int j = 1; j <= i; j++) { 13 // 无缝衔接 14 // 左边j - 1个数,右边i - j个数,我们只需要考虑有多少个数,就行不需要考虑是哪些数,因为二分之后的数都是连续的 15 // 组成的方案还是相同的,不需要管具体是哪些连续的数组成二叉搜索树 16 dp[i] += dp[j - 1] * dp[i - j]; 17 } 18 } 19 return dp[n]; 20 } 21 }
leetcode链接:https://leetcode-cn.com/problems/unique-binary-search-trees/