leetcode 96. 不同的二叉搜索树
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
提示:
-
1 <= n <= 19
Related Topics
树
二叉搜索树
数学
动态规划
二叉树
思路1:动态规划
对序列1,2,3......,n构建二叉搜索树,我们可以以i为节点,那么(1,2.....i-1)为左子树和(i+1,....n)为右子树构建二叉搜索树。将一个大问题,分解为小问题求解。
以n==4为例:
-
当1为根节点的时候:
-
左子树为空,只有一种可能性。
-
右子树有3个元素,由示例1知道,3个元素构成的二叉搜索树有5种可能性。
-
总共有有1*5种。
-
-
当2为根节点的时候:
-
左子树只有一个元素,一种可能性。
-
右子树2个元素,2种可能性。
-
总共1*2
-
-
当3为根节点的时候:
-
左子树2个元素,2种可能性。
-
右子树1个元素,1种可能性。
-
-
当4为根节点的时候:
-
左子树3个元素,5种可能性,
-
右子树为空,1种可能性。
-
所以:如果求长度为n的个数,必须求出来长度为n-1的个数。
长度为i的个数需要遍历以1...i
为根结点的个数。当根节点为j
时,左子树的个数为j-1
,右子树个数为i-j
然后将以1..i为根的二叉搜索树个数加起来即可。
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]; } }