给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
思路:
这道题完全没有思路,想通过动态规划来找规律发现很难找,于是直接看了discuss和其他博客的解答,这里做下记录:
直接看规律dp[n]表示有n有几种情况,规定空子树也是一种情况dp[0]=1:
n=1时,一共有dp[1]=1种情况。
1
n=2时,一共有dp[0]*dp[1]+dp[1]*dp[0]种情况,即左边0个节点*右边1个节点+左边1个节点*右边0个节点的总数。
1 1 \ / 2 2n=3时,一共有dp[0]*dp[2]+dp[1]*dp[1]+dp[2]*dp[0]种情况,对应左0*右2+左1*右1+左2*右0的情况。
1 1 2 3 3 \ \ / \ / / 3 2 1 3 2 1 / \ / \ 2 3 1 2
代码如下:
int numTrees(int n) { vector<int> res( n + 1,0 ); res[0] = 1; res[1] = 1; for (int i = 2; i <= n; i++) { for (int j = 0; j < i; j++) { res[i] += res[j] * res[i - j-1]; } } return res[n]; }